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, 416, 3]})

При вызове ..keras.convert (....) я получаю сообщение об ошибке:

TypeError: слой Keras типа ‹class 'tensorflow.python.keras.engine.functional.Functional'› не поддерживается.


person simplesystems    schedule 27.08.2020    source источник


Ответы (1)


Внутренние математические операции в Keras (в вашем случае tanh и softplus) не являются слоями, которые можно преобразовать. Вместо этого попробуйте использовать версии функций Layer или Activation для восстановления функций.

В общем, если вы хотите использовать настраиваемый уровень или активацию, которые не поддерживаются CoreML, вам необходимо указать настраиваемую функцию в методе преобразования и предоставить реализацию Swift / Objective-C. Вот хорошее руководство, как сделать это для активации Swish: https://machinethink.net/blog/coreml-custom-layers/

person anklebreaker    schedule 17.10.2020