keras - 使用自定义层转换 Keras 到 Core ML 模型 - 忽略转换功能
问题描述
我正在尝试将通过 Keras 训练的模型(以 TensorFlow 1.x 作为后端)转换为 Core ML 格式(.mlmodel
)。我有模型的完整来源和权重,以及冻结的 Keras 图(.h5
文件)。我的模型(请参阅此处的架构)是使用 Keras 功能 API 定义的,并且有一个名为AttentionWeightedAverage
.
运行以下转换代码时,我收到一个ValueError: Unknown layer: AttentionWeightedAverage
.
import coremltools
mlmodel = coremltools.converters.keras.convert('deepmoji_model.h5')
自然,由于这是一个自定义层(它也恰好有一个名为 的布尔超参数return_attention
),我知道我需要告诉 Core ML 如何处理它,所以我根据Matthijs Hollemans 的精彩博文实现了以下内容:
class AttentionWeightedAverage(Layer):
# class defined inline here ...
# https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py
def convert_ATTN(layer):
params = NeuralNetwork_pb2.CustomLayerParams()
params.className = "AttentionWeightedAverage"
params.description = "A fancy new activation function"
params.parameters["return_attention"].boolValue = layer.return_attention
return params
mlmodel = coremltools.converters.keras.convert('deepmoji_model.h5',
add_custom_layers=True,
custom_conversion_functions={"AttentionWeightedAverage": convert_ATTN}
)
但是,在尝试运行转换时,我仍然收到与上述相同的“未知层”错误。什么可能导致转换脚本无法识别我提供的转换功能?
我正在运行coremltools == 3.3
(最新)keras == 2.3.1
。非常感谢任何指导!
解决方案
事实证明,该Unknown layer
错误源于 Keras 本身,load_model
由于无法反序列化自定义层,因此无法成功。相反,如果我们将完全反序列化的模型(而不仅仅是文件路径)传递给转换器,则转换器可以毫无问题地运行。
model = load_model('deepmoji_model.h5', custom_objects={'AttentionWeightedAverage': AttentionWeightedAverage()})
mlmodel = coremltools.converters.keras.convert(model,
add_custom_layers=True,
custom_conversion_functions={"AttentionWeightedAverage": convert_ATTN}
)
mlmodel.save('deepmoji_model.mlmodel')
推荐阅读
- discord - 一个删除所有消息的机器人,除了说“土豆”的消息
- loops - 使用 for 循环构造具有自回归结构的矩阵
- c++ - cpp文件中的“重新定义类”错误
- python - 打印此图像的正确方法是什么?
- excel - VBA:我得到“对象变量或未设置块变量”
- ios - 使用 Firebase 和 SwiftUI
- c# - 当启用对象中的所有动画师(包括子动画师)时,它会改变对象的位置,将其放得更高我该如何避免它?
- google-chrome-extension - 如何在 Chrome 扩展程序中用该文本的更改版本替换文本?
- postgresql - 收到错误“无法访问文件“pg_stat_statements”:没有这样的文件或目录”
- arrays - 如何在 MATLAB 中计算 2 个不同的数组元素重复的次数?