【问题标题】:CoreML LSTM input doesn't match Keras input shapeCoreML LSTM 输入与 Keras 输入形状不匹配
【发布时间】:2020-04-28 10:26:47
【问题描述】:

我正在尝试将一个非常简单的 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 中,您可以看到它从模型中解释的输入

编辑(20 年 1 月 12 日):

我尽量聪明,直接在python中编辑coreml模型,

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

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

作为参考,以下是我的笔记本正在运行的库版本:

keras 2.2.5
tensorflow 1.15.0
coremltools 3.1

【问题讨论】:

  • 你在使用 keras、tensorflow 的哪个后端??
  • 是的,我相信它使用了 tensorflow 后端。我在 google colab 中运行我的代码

标签: keras coreml coremltools


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2019-01-20
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多