Keras到Core ML模型转换,自定义层-转换函数被忽略

Keras到Core ML模型转换,自定义层-转换函数被忽略,keras,coreml,coremltools,Keras,Coreml,Coremltools,我正在尝试将一个通过Keras培训的模型转换为核心ML格式(.mlmodel)。我有模型的完整来源和权重,还有一个冻结的Keras图(.h5文件)。使用Keras函数API定义,并有一个名为AttentionWeightedAverage的自定义层 运行以下转换代码时,我收到一个值错误:未知层:AttentionWeightedAverage 导入coremltools mlmodel=coremltools.converts.keras.convert('deepmoji_model.h5')

我正在尝试将一个通过Keras培训的模型转换为核心ML格式(
.mlmodel
)。我有模型的完整来源和权重,还有一个冻结的Keras图(
.h5
文件)。使用Keras函数API定义,并有一个名为
AttentionWeightedAverage
的自定义层

运行以下转换代码时,我收到一个
值错误:未知层:AttentionWeightedAverage

导入coremltools
mlmodel=coremltools.converts.keras.convert('deepmoji_model.h5'))
自然地,由于这是一个自定义层(它也恰好有一个名为
return\u attention
的布尔超参数),我知道我需要告诉Core ML如何处理它,因此我基于以下内容实现了以下内容:

课堂出席率加权平均值(层):
#在此处内联定义的类。。。
# https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py
def转换附件(图层):
params=NeuralNetwork_pb2.CustomLayerParams()
params.className=“AttentionWeightedAverage”
params.description=“一种新颖的激活功能”
params.parameters[“return\u attention”]。布尔值=layer.return\u attention
返回参数
mlmodel=coremltools.converts.keras.convert('deepmoji_model.h5',
添加自定义图层=真,
自定义_转换_函数={“AttentionWeightedAverage”:convert_ATTN}
)
但是,在尝试运行转换时,我仍然收到与上面相同的“未知层”错误。是什么导致转换脚本无法识别我提供的转换函数


我使用
keras==2.3.1
运行
coremltools==3.3
(最新版本)。非常感谢您的指导

事实证明,
未知层
错误源于Keras本身,它无法成功地
加载\u模型
,因为它无法反序列化自定义层。相反,如果我们将一个完全反序列化的模型(而不仅仅是文件路径)传递给转换器,那么转换器将毫无问题地运行

model=load_model('deepmoji_model.h5',自定义_对象={'AttentionWeightedAverage':AttentionWeightedAverage()})
mlmodel=coremltools.Converter.keras.convert(型号,
添加自定义图层=真,
自定义_转换_函数={“AttentionWeightedAverage”:convert_ATTN}
)
mlmodel.save('deepmoji_model.mlmodel'))

事实证明,
未知层
错误源于Keras本身,由于无法反序列化自定义层,Keras无法成功地
加载\u模型。相反,如果我们将一个完全反序列化的模型(而不仅仅是文件路径)传递给转换器,那么转换器将毫无问题地运行

model=load_model('deepmoji_model.h5',自定义_对象={'AttentionWeightedAverage':AttentionWeightedAverage()})
mlmodel=coremltools.Converter.keras.convert(型号,
添加自定义图层=真,
自定义_转换_函数={“AttentionWeightedAverage”:convert_ATTN}
)
mlmodel.save('deepmoji_model.mlmodel'))