CoreML遇到的问题和原因
issue list
· unsupported ops of type gatherv2
· Embedding layer: ‘embedding_1’: height dimension of the input blob must be 1.
· NSLocalizedDescription = “Failure dynamically resizing for sequence length.”
· NSLocalizedDescription = “Neural Network inputs can only be of size 1, 3, or 5.”;
· Invalid dst shape when converting from Keras to Coreml
unsupported ops of type gatherv2
NLP处理中需要用到 Embedding Layer,
Tensorflow中的Embedding层会用到 gatherV2 ops,而CoreML不支持GatherV2 算子,因此会报这个错误。
解决办法
用 Keras 构建 NLP 模型中的 Embedding 层,这个在CoreML中是支持的。
eight dimension of the input blob must be 1
相关错误
· channel dimension of the input blob must be 1.
· width dimension of the input blob must be 1.
CoreML的 Embedding Layer 要求在 C H W 三个维度上必须要都为1,就是只接受以下形式的输入
input shape = (1, 1, 1)
通常在 Keras 或者 Tensorflow 中会构建以下形式的输入
input shape = (None, sequence length)
其中 None 是 batch size。
为了满足 CoreML Embedding layer 的规则,需要将输入增加一个维度,也即是在 Keras中把输入改为
input shape = (None, sequence length, 1)
CoreML 接受的输入维度是rank 1, 3, 5,
[batch_size, sequence_length, channel, width, height]
这里增加的最后一个维度会被CoreML扩展为 C H W,这样就能顺利地输入到 Embedding layer。
“Failure dynamically resizing for sequence length.”
原因:输入数据维度无法被CoreML识别
常见原因:如果定义了一个模型,第一层是 keras.layers.Input(),后面没有增加一层 Reshape 对输入维度进行调整而是直接送入到Embedding,那么这个模型虽然在 Keras 规则下能成功训练并使用来预测,但在转换为 CoreML 后就无法正常输入数据来 predict了,这是CoreML底层框架的bug。
解决办法:在Input之后增加一层Reshape,在Keras角度把维度扩展为
input shape = (None, sequence length, 1)
从 CoreML 角度是
input shape = (None, sequence length, 1, 1, 1)
能解决问题。
Neural Network inputs can only be of size 1, 3, or 5
常见问题,因为 CoreML 只接受输入为 rank1, rank3, rank5 的数据。除此之外的所有数据格式在predict的时候都会引起这个异常。
可以用TextCNN模型,构建一个rank2的输入数据,塞到coreml模型里尝试引起这个异常。
data = {'input_text': np.array([[1.0]])} <-- rank2
result = coreml_model.predict(data, useCPUOnly=True)['sentiment']
print('predict with coreml result: %s ' % result)
Invalid dst shape when converting from Keras to Coreml
这是coreml的一个bug,原因是coreml在做模型转换的时候对维度的扩展算法有bug,下面是一段可以重现问题的代码
sequence_length = 400
input_text = layers.Input(shape=(sequence_length, ), name='input_text')
emb = layers.Embedding(1000, 64, name='embedding')(input_text)
reshape = layers.Reshape([sequence_length, 64, 1], name='reshape')(emb)
model = keras.models.Model(inputs=[input_text], outputs=[reshape])
converted = coremltools.converters.keras.convert(model,input_names='input_text',output_names='reshape')
把 sequence_length 改为399就可以重现问题,异常log类似如下
RuntimeWarning: You will not be able to run predict() on this Core ML model. Underlying exception message was: Error compiling model: "compiler error: Invalid dst shape1 x 1 x 64 x 1->399->64 x 400 x 1 x 0 x 1 x ".
解决方法:
在输入层和embedding中间增加reshape层
sequence_length = 400
input_text = layers.Input(shape=(sequence_length, ), name='input_text')
reshape_1 = layers.Reshape(input_shape=(sequence_length, ), target_shape=(sequence_length, 1, ))(input_text) <--- focus on here
emb = layers.Embedding(1000, 64, name='embedding')(reshape_1)
reshape = layers.Reshape([sequence_length, 64, 1], name='reshape')(emb)
model = keras.models.Model(inputs=[input_text], outputs=[reshape])
converted = coremltools.converters.keras.convert(model,input_names='input_text',output_names='reshape')
相关问题记录在coreml的git上
Invalid dst shape when converting from Keras to Coreml #496
CoreML遇到的问题和原因相关推荐
- ios apple语音性别_如何使用Apple的CoreML和Vision API构建图像识别iOS应用
ios apple语音性别 by Mark Mansur 马克·曼苏尔(Mark Mansur) 如何使用Apple的CoreML和Vision API构建图像识别iOS应用 (How to buil ...
- CoreML 机器学习 VISION
ML是Machine Learning的缩写,也就是'机器学习',这正是现在很火的一个技术,它也是人工智能最核心的内容.比如说横扫世界棋坛大名鼎鼎的阿尔法狗(AlphaGo),或者已经深入大家生活场景 ...
- JS Uncaught SyntaxError:Unexpected identifier异常报错原因及其解决方法
最近在写ajax的时候,调用js方法,遇到了Uncaught SyntaxError:Unexpected identifier异常报错,开始搞不清原因,很苦恼. 以为是js方法参数个数和长度的问题, ...
- java.lang.NullPointerException异常原因及解决
java.lang.NullPointerException异常原因是因为创建了一个引用类型的变量却没有指向任何对象而又去通过这个引用类型变量加点的形式去访问非静态的方法及属性. 给出三种情况, 第一 ...
- SQL性能下降原因及Join查询
原因 查询语句写得烂 索引失效 关联查询过多(设计缺陷) 服务器调优及各个参数设置(缓冲.线程数等) Join查询的SQL执行顺序 手写 SELECT <select_list> FROM ...
- 从C到C++过渡的3个原因
从C到C++过渡的3个原因 3 reasons to transition from C to C++ 几十年来,嵌入式软件工程师们一直在争论他们是否应该使用C或C++.根据2019年嵌入式市场调查, ...
- 使用hibernate与mysql时数据不能插入的原因及解决办法
1.背景 之前从没用过hibernate,因此在网上搜了一下hibernate快速入门方面的信息,最后我按照<Myeclipse Hibernate 快速入门 中文版>(CSDN,百度文库 ...
- golang log4go 使用说明及丢失日志原因
1. 描述 这个 repository 是从 alecthomas 的 log4go 重构而来的,log4go 是一个类似于用于 Java 编程语言的 log4j 的日志包.源于 Google 的一项 ...
- javascript小数相减会出现一长串的小数位数的原因
javascript小数相减会出现一长串的小数位数的原因 <script> var a='38.8'; var b='6.8'; alert(parseFloat(a)-parseFloa ...
最新文章
- 神经网络结构优化:这篇论文让你无惧梯度消失或爆炸,轻松训练万层神经网络...
- java 计算器 小程序_java应用小程序计算器
- 如何获取 sql server 最新补丁
- DCMTK:将PDF文件封装为DICOM文件
- Yii的查询后缀限定
- Android Studio提示No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder
- python 文件写入多个参数_pandas 把数据写入txt文件每行固定写入一定数量的值方法...
- php+静态变量的初始值,php 静态变量的初始化
- 对乱糟糟的日志说再见
- python列表数据类型-入门学习
- Linux学习笔记---使用BusyBox创建根文件系统(二)
- Luogu1613 跑路
- 数组存放字符_字符串的 3种表示方法,不会用不是合格的程序员
- No qualifying bean of type;Unsatisfied dependency expressed through field 解决办法(总结全网)
- CRMEB小程序商城源码,好多程序员都在用的开源商城源码
- 人脸关键点数据集整理
- 南无阿弥陀佛是什么意思呢
- 《计算机网络教程》(微课版 第五版)第七章 网络安全 课后习题及答案
- 百度冰桶算法说明,如何避免冰桶算法呢?
- Microsoft CSP简介
热门文章
- 外汇天眼:英国研究人员与南非合作应对气候变化
- 生成模型笔记预备知识笔记——概率分布变换
- 记一个openwrt reboot异步信号处理死锁问题
- 2.7 数值分析: 向量的范数
- windows10未激活更换壁纸
- 分区失败,在计算机中不能打开磁盘,但是在磁盘管理软件中能打开的解决方法
- pytorch-->optimizer.zero_grad()、loss.backward()、optimizer.step()和scheduler.step()
- 毕业设计 Stm32人体心率血氧无线监测系统 - 单片机 物联网
- setoolkit克隆网站并抓取账号密码
- 【获取内置命令ID】:VBA编程人员常用的工具。可以查询Excel内部命令的ID号