【问题标题】:Error in converting keras model to core ml model将 keras 模型转换为核心 ml 模型时出错
【发布时间】: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')

当我在其中输入图像时,我没有得到任何输出。我的意思是图像输出为零。 我进入调试模式,但在模型预测中找不到任何错误。

我猜测问题可能出在编译模型上,但我不知道如何解决它。 感谢您的帮助。

【问题讨论】:

    标签: machine-learning keras tf.keras coreml coremltools


    【解决方案1】:

    如果您的模型包含 LSTM 层,Core ML 期望您手动传递 LSTM 状态,这就是您获得所有这些额外输入和输出的原因。 Keras 会为您管理此状态,但 Core ML 不会。

    【讨论】:

    • 您创建 MLMultiArray 对象,用正确的值开始填充它们,然后将它们与您的主要输入一起传递到模型中。模型会输出这些 MLMultiArray 的新版本,您下次调用模型时需要使用这些新版本。等等……
    • lstm 的输入类型究竟是什么?我要在 Keras 中检查它吗?
    • 当您打印模型时,它会显示 multiArrayType { shape: 256 dataType: DOUBLE },因此它是一个包含 256 个双精度数据类型元素的多数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2019-05-26
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多