将 keras 模型转换为核心 ml 模型时出错
Posted
技术标签:
【中文标题】将 keras 模型转换为核心 ml 模型时出错【英文标题】:Error in converting keras model to core ml model 【发布时间】:2021-04-24 10:20:21 【问题描述】:我一直在尝试将 Keras 模型转换为核心 mlmodel。但是,在这样做的同时,我得到了多个输入和输出。我只想将以下内容作为输入和输出。
name: "input"
type
imageType
width: 256
height: 64
colorSpace: GRAYSCALE
name: "output"
type
dictionaryType
stringKeyType
我得到的当前模型。
type
imageType
width: 256
height: 64
colorSpace: GRAYSCALE
, name: "lstm1_h_in"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm1_c_in"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm1_h_in_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm1_c_in_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm2_h_in"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm2_c_in"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm2_h_in_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
, name: "lstm2_c_in_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
isOptional: true
]
[name: "output"
type
dictionaryType
stringKeyType
, name: "lstm1_h_out"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm1_c_out"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm1_h_out_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm1_c_out_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm2_h_out"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm2_c_out"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm2_h_out_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "lstm2_c_out_rev"
type
multiArrayType
shape: 256
dataType: DOUBLE
, name: "classLabel"
type
stringType
]
我正在使用此代码进行转换:
from keras.models import load_model
import coremltools as ct
class_labels = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f",
"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "-"]
tf_keras_model = load_model("HTRAdam.h5")
mlmodel = ct.converters.keras.convert('HTRAdam.h5', input_names=['image'], output_names=['output'],
class_labels=class_labels, image_input_names='image')
mlmodel.save('HTR.mlmodel')
当我在其中输入图像时,我没有得到任何输出。我的意思是图像输出为零。 我进入调试模式,但在模型预测中找不到任何错误。
我猜测问题可能出在编译模型上,但我不知道如何解决它。 感谢您的帮助。
【问题讨论】:
【参考方案1】:如果您的模型包含 LSTM 层,Core ML 期望您手动传递 LSTM 状态,这就是您获得所有这些额外输入和输出的原因。 Keras 会为您管理此状态,但 Core ML 不会。
【讨论】:
您创建 MLMultiArray 对象,用正确的值开始填充它们,然后将它们与您的主要输入一起传递到模型中。模型会输出这些 MLMultiArray 的新版本,您下次调用模型时需要使用这些新版本。等等…… lstm 的输入类型究竟是什么?我要在 Keras 中检查它吗? 当您打印模型时,它会显示multiArrayType shape: 256 dataType: DOUBLE
,因此它是一个包含 256 个双精度数据类型元素的多数组。以上是关于将 keras 模型转换为核心 ml 模型时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Keras .h5 模型转换为暗网 yolo.weights 格式?
Keras - 无法将我的输入数据释放到 keras 模型。检查输入时出错