我正在尝试将一个非常简单的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()
修改(01/12/20):
我试图变得聪明,只是直接在python中编辑coreml模型,
import coremltools
coreml_model = coremltools.converters.keras.convert(model)
coreml_model.save("Echo.mlmodel")
也供参考,以下是我的笔记本计算机正在运行的库版本:
coreml_model._spec.description.input[0].type.multiArrayType.shape[:] = [1, 5, 10]
答案 0 :(得分:1)
经过一些调查,看来输入的“类型”标签有点误导。尽管它说MultiArray (Double 10)
,但实际上它接受多维数组。需要注意的是数组的形状。
在使用Keras的情况下,我可能会传入大小为(1, 5, 10)
的数组(即在运行(batch, timestemps, features)
时使用predict
的数组,而使用CoreML,则必须转置输入以匹配{{1} }。
因此,解释Xcode“类型”字段的正确方法是说输入接受10个功能。应该使用“描述”字段(在屏幕截图中看不到)来描述预期的数组形状。