问题描述
我训练了一个自定义的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]})
TypeError:类型为
不是 支持
解决方法
Keras中的后端数学运算(在您的情况下为tanh和softplus)不是可以转换的层。而是尝试使用功能的“层”或“激活”版本来重构功能。
通常,如果要CoreML不支持的自定义层或激活,则需要在convert方法中指定自定义函数,并提供Swift / Objective-C实现。这是执行Swish激活操作的良好指南:https://machinethink.net/blog/coreml-custom-layers/