keras - CoreML LSTM 输入与 Keras 输入形状不匹配
问题描述
我正在尝试将一个非常简单的 keras 模型转换为 CoreML,但是,CoreML 模型的输入似乎与我的期望不符。
我正在创建的模型的输入形状为 (5, 10) (五个时间步长,10 个特征),但是,在转换模型并在 Xcode 中打开模型后,它说输入类型是MultiArray (Double 10)
,据我了解是一维数组。我的问题是,我做错了什么?有没有办法告诉 CoreML 输入具体是 5x10?
这是我正在创建的 keras 模型
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
length = 5
n_features = 10
out_index = 2
model = Sequential()
model.add(LSTM(25, input_shape=(length, n_features)))
model.add(Dense(n_features, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
我运行以下代码来转换模型
import coremltools
coreml_model = coremltools.converters.keras.convert(model)
coreml_model.save("Echo.mlmodel")
编辑(20 年 1 月 12 日):
我试着聪明点,直接在python中编辑coreml模型,
coreml_model._spec.description.input[0].type.multiArrayType.shape[:] = [1, 5, 10]
也供参考,这里是我的笔记本正在运行的库版本:
keras 2.2.5
tensorflow 1.15.0
coremltools 3.1
解决方案
经过一番调查,看起来输入“类型”标签有点误导。虽然它说MultiArray (Double 10)
,但它实际上接受了一个多维数组。这里需要注意的是数组的形状。
而对于 Keras,我可能会传入一个大小数组(1, 5, 10)
(即(batch, timestemps, features)
在运行时predict
,使用 CoreML,您必须将输入转置为 match (timestep, batch, features)
。
因此,解释 Xcode“类型”字段的正确方法是说输入接受 10 个特征。“描述”字段(在屏幕截图中未显示)应该用于描述预期的数组形状应该是什么。
推荐阅读
- events - 我们真的可以使用 Event Sourcing 和 CQRS,一种用于电子商务结账渠道的事件驱动架构吗?
- javascript - 1000 万个条目的 MongoDB 种子脚本需要 30 分钟
- excel - 如何授予 Applescript 应用程序的权利
- asp.net - IIS Windows Server 2012 - 由于捆绑/访问问题,生产网站未加载 CSS、图像或 JS
- rest - REST API 架构
- bash - 我有一个按第一列排序的制表符分隔数据框,如何在第一列的唯一值之间添加一个空行?
- python - 在python中删除joblibmem映射文件夹的Windows权限错误
- python - 我的字符串没有被读取,但是我的整数是
- javascript - 开始 Javascript 表单验证
- python - 根据 Pandas 中的另一个 DataFrame 修改 DataFrame