首页 > 解决方案 > 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")

在 Xcode 中,您可以看到它从模型中解释的输入 Xcode CoreML 输入输出

编辑(20 年 1 月 12 日):

我试着聪明点,直接在python中编辑coreml模型,

coreml_model._spec.description.input[0].type.multiArrayType.shape[:] = [1, 5, 10]

不幸的是,这会导致 Xcode 中的编译错误 Xcode 编译错误

也供参考,这里是我的笔记本正在运行的库版本:

keras 2.2.5
tensorflow 1.15.0
coremltools 3.1

标签: kerascoremlcoremltools

解决方案


经过一番调查,看起来输入“类型”标签有点误导。虽然它说MultiArray (Double 10),但它实际上接受了一个多维数组。这里需要注意的是数组的形状。

而对于 Keras,我可能会传入一个大小数组(1, 5, 10)(即(batch, timestemps, features)在运行时predict,使用 CoreML,您必须将输入转置为 match (timestep, batch, features)

因此,解释 Xcode“类型”字段的正确方法是说输入接受 10 个特征。“描述”字段(在屏幕截图中未显示)应该用于描述预期的数组形状应该是什么。


推荐阅读