CoreML LSTM输入与Keras输入形状不匹配

时间:2020-01-10 18:39:36

标签: keras coreml coremltools

我正在尝试将一个非常简单的keras模型转换为CoreML,但是,CoreML模型的输入似乎与我的期望不符。

我正在创建的模型的输入形状为(5,10)(五个时间步长,有10个特征),但是,在转换模型并在Xcode中打开模型后,它说输入类型为{{1 }},据我所知是一维数组。我的问题是,我在做什么错?有没有办法告诉CoreML输入是5x10的?

这是我正在创建的keras模型

MultiArray (Double 10)

我运行以下代码来转换模型

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()

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

修改(01/12/20):

我试图变得聪明,只是直接在python中编辑coreml模型,

import coremltools
coreml_model = coremltools.converters.keras.convert(model)
coreml_model.save("Echo.mlmodel")

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

也供参考,以下是我的笔记本计算机正在运行的库版本:

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

1 个答案:

答案 0 :(得分:1)

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

在使用Keras的情况下,我可能会传入大小为(1, 5, 10)的数组(即在运行(batch, timestemps, features)时使用predict的数组,而使用CoreML,则必须转置输入以匹配{{1} }。

因此,解释Xcode“类型”字段的正确方法是说输入接受10个功能。应该使用“描述”字段(在屏幕截图中看不到)来描述预期的数组形状。