如何在iOS(或Android)应用程序中使用keras h5型号

如何在iOS(或Android)应用程序中使用keras h5型号,keras,coreml,Keras,Coreml,我用keras retinanet 50训练了一个模型,现在我有了一个h5文件,在用静态图像测试它时效果非常好 我很想在iOS(和/或Android)应用程序中使用它,但我无法将其转换为coreml: import coremltools coreml_model = coremltools.converters.keras.convert(model) # => error occurs coreml_model.save('my_model.mlmodel') 错误是 ---

我用keras retinanet 50训练了一个模型,现在我有了一个h5文件,在用静态图像测试它时效果非常好

我很想在iOS(和/或Android)应用程序中使用它,但我无法将其转换为coreml:

import coremltools
coreml_model = coremltools.converters.keras.convert(model) # => error occurs
coreml_model.save('my_model.mlmodel')
错误是

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
  <ipython-input-7-ba230c07a72c> in <module>()
      1 import coremltools
----> 2 coreml_model = coremltools.converters.keras.convert(model)
      3 # Saving the Core ML model to a file.
      4 coreml_model.save('my_model.mlmodel')

/home/jonas/projects/keras/keras-env/local/lib/python2.7/site-packages/coremltools/converters/keras/_keras_converter.pyc in convert(model, input_names, output_names, image_input_names, is_bgr, red_bias, green_bias, blue_bias, gray_bias, image_scale, class_labels, predicted_feature_name, model_precision, predicted_probabilities_output, add_custom_layers, custom_conversion_functions)
    743                       predicted_probabilities_output,
    744                       add_custom_layers,
--> 745                       custom_conversion_functions=custom_conversion_functions)
    746 
    747     return _MLModel(spec)

/home/jonas/projects/keras/keras-env/local/lib/python2.7/site-packages/coremltools/converters/keras/_keras_converter.pyc in convertToSpec(model, input_names, output_names, image_input_names, is_bgr, red_bias, green_bias, blue_bias, gray_bias, image_scale, class_labels, predicted_feature_name, model_precision, predicted_probabilities_output, add_custom_layers, custom_conversion_functions, custom_objects)
    541                                            add_custom_layers=add_custom_layers,
    542                                            custom_conversion_functions=custom_conversion_functions,
--> 543                                            custom_objects=custom_objects)
    544     else:
    545         raise RuntimeError(

/home/jonas/projects/keras/keras-env/local/lib/python2.7/site-packages/coremltools/converters/keras/_keras2_converter.pyc in _convert(model, input_names, output_names, image_input_names, is_bgr, red_bias, green_bias, blue_bias, gray_bias, image_scale, class_labels, predicted_feature_name, predicted_probabilities_output, add_custom_layers, custom_conversion_functions, custom_objects)
    185 
    186     # Check valid versions
--> 187     _check_unsupported_layers(model, add_custom_layers)
    188 
    189     # Build network graph to represent Keras model

/home/jonas/projects/keras/keras-env/local/lib/python2.7/site-packages/coremltools/converters/keras/_keras2_converter.pyc in _check_unsupported_layers(model, add_custom_layers)
     98         else:
     99             if type(layer) not in _KERAS_LAYER_REGISTRY:
--> 100                 raise ValueError("Keras layer '%s' not supported. " % str(type(layer)))
    101             if isinstance(layer, _keras.layers.wrappers.TimeDistributed):
    102                 if type(layer.layer) not in _KERAS_LAYER_REGISTRY:

ValueError: Keras layer '<class 'keras_resnet.layers._batch_normalization.BatchNormalization'>' not supported. 
然后

import coremltools
coreml_model = coremltools.converters.keras.convert(model, custom_conversion_functions={"BatchNormalization": BatchNormalization})

但是我仍然得到相同的错误…

在推理过程中也使用了批处理规范化,核心ML确实支持它

但是,
keras\u resnet.layers.\u batch\u normalization.BatchNormalization
不是keras的标准BatchNormalization层,因此coremltools不了解如何处理它

好消息是:这个新的BatchNormalization层扩展了Keras标准的BatchNormalization层,因此可以使您的模型与Core ML一起工作

三种选择:

  • 您可以告诉coremltools这是一个自定义层,然后在处理自定义层的函数中返回一个
    BatchNormalLayerParams
    对象。有关如何在coremltools中处理自定义图层的更多信息:
  • 您可以将模型中的
    keras\u resnet.layers.\u batch\u normalization.BatchNormalization
    层替换为
    keras.layers.BatchNormalization
    层,然后像往常一样运行coremltools

  • 找出coremltools的安装位置,然后在\u keras2\u converter.py中,为keras\u resnet.layers添加一行。\u batch\u normalization.BatchNormalization,如下所示:

    keras_resnet.layers._batch_normalization.BatchNormalization:  _layers2.convert_batchnorm,
    
    就像这里:

    您还必须将
    keras\u resnet
    导入此文件,否则coremltools将无法找到此模块。然后像往常一样运行coremltools


  • 谢谢我尝试了选项1)-所以我将
    coremltools.converters.keras.convert(model)
    更改为
    coremltools.converters.keras.convert(model,自定义转换函数={“BatchNormalization”:…})
    ,对吗?但我不能准确地得到我必须输入的值,即def函数应该是什么样子,我需要将其放入其中…这不是
    custom\u conversion\u函数
    的工作方式。您必须编写一个函数来接受这个定制的BatchNormalization层,并将其转换为核心ML所理解的内容。我在答案中添加了一个选项3,这可能是最简单的解决方案。谢谢,似乎我又向前迈出了一步:
    Keras层“”不受支持。
    如果您能帮助我解决这个问题,那将非常棒,我将尽快添加一个悬赏,并奖励您!看起来您需要为其编写一个转换函数。Core ML确实有上采样层,但coremltools不知道keras\u retinanet.layers.\u misc.UpsampleLike是上采样层。
    keras_resnet.layers._batch_normalization.BatchNormalization:  _layers2.convert_batchnorm,