将 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 构建 TensoRRT 引擎时出错

如何将 Keras .h5 模型转换为暗网 yolo.weights 格式?

Keras - 无法将我的输入数据释放到 keras 模型。检查输入时出错

如何将暗网 yolo 模型转换为 keras?

将 keras 模型从 pb 文件转换为 tflite 文件

尝试将我的keras模型导出到tensorflow服务时出错