Coremltools TypeError:不支持Keras图层类型

问题描述

我训练了一个自定义的YOlov4模型。然后我将权重转换为.h5:

https://github.com/david8862/keras-YOLOv3-model-set/tree/master/tools/model_converter

之后,我尝试将.h5转换为coreml:

# Custom activation function
from keras.layers import Activation
from keras import backend as K
from keras.utils.generic_utils import get_custom_objects

def mish(x):
  return x * K.tanh(K.softplus(x))

get_custom_objects().update({'mish': Activation(mish)})

from keras.models import load_model
from keras.utils import CustomObjectScope
from keras.initializers import glorot_uniform

with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
    model = load_model('yolov4_custom.h5',compile=False)

mlModel = coremltools.converters.keras.convert(model,input_names='image',image_input_names='image',input_name_shape_dict={'image': [None,416,3]})

调用..keras.convert(....)时出现错误

TypeError:类型为不是 支持

解决方法

Keras中的后端数学运算(在您的情况下为tanh和softplus)不是可以转换的层。而是尝试使用功能的“层”或“激活”版本来重构功能。

通常,如果要CoreML不支持的自定义层或激活,则需要在convert方法中指定自定义函数,并提供Swift / Objective-C实现。这是执行Swish激活操作的良好指南:https://machinethink.net/blog/coreml-custom-layers/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...