keras和tf.keras模型之间的兼容性

keras和tf.keras模型之间的兼容性,keras,tf.keras,coremltools,Keras,Tf.keras,Coremltools,我感兴趣的是在tf.keras中训练一个模型,然后用keras加载它。我知道这不是很明智,但我对使用tf.keras来训练模型感兴趣,因为 tf.keras更容易构建输入管道 我想利用tf.dataset API 我有兴趣把keras装进去因为 我想使用coreml将模型部署到ios 我想使用coremltools将我的模型转换为ios,coreml工具只适用于keras,而不适用于tf.keras 我遇到了一些障碍,因为不是所有的tf.keras层都可以作为keras层加载。例如,我使用简单的

我感兴趣的是在tf.keras中训练一个模型,然后用keras加载它。我知道这不是很明智,但我对使用tf.keras来训练模型感兴趣,因为

  • tf.keras更容易构建输入管道
  • 我想利用tf.dataset API
  • 我有兴趣把keras装进去因为

  • 我想使用coreml将模型部署到ios
  • 我想使用coremltools将我的模型转换为ios,coreml工具只适用于keras,而不适用于tf.keras
  • 我遇到了一些障碍,因为不是所有的tf.keras层都可以作为keras层加载。例如,我使用简单的DNN没有问题,因为tf.keras和keras之间的所有致密层参数都是相同的。但是,我在使用RNN层时遇到了问题,因为tf.keras有一个keras没有的参数
    time\u major
    。我的RNN层具有
    time\u major=False
    ,这与keras的行为相同,但keras顺序层没有此参数

    我现在的解决方案是将tf.keras模型保存在一个json文件中(用于模型结构),删除keras不支持的部分图层,并保存一个h5文件(用于权重),如下所示:

    model = # model trained with tf.keras
    
    # save json
    model_json = model.to_json()
    with open('path_to_model_json.json', 'w') as json_file:
        json_ = json.loads(model_json)
        layers = json_['config']['layers']
        for layer in layers:
            if layer['class_name'] == 'SimpleRNN':
                del layer['config']['time_major']
        json.dump(json_, json_file)
    
    # save weights
    model.save_weights('path_to_my_weights.h5')
    
    with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
        coreml_model = coremltools.converters.keras.convert(
            model=('path_to_model_json','path_to_my_weights.h5'),
            input_names=#inputs, 
            output_names=#outputs,
            class_labels = #labels, 
            custom_conversion_functions = { "GlorotUniform": tf.keras.initializers.glorot_uniform
                                                }
        )
        coreml_model.save('my_core_ml_model.mlmodel')
    
    然后,我使用coremlconverter工具将keras转换为coreml,如下所示:

    model = # model trained with tf.keras
    
    # save json
    model_json = model.to_json()
    with open('path_to_model_json.json', 'w') as json_file:
        json_ = json.loads(model_json)
        layers = json_['config']['layers']
        for layer in layers:
            if layer['class_name'] == 'SimpleRNN':
                del layer['config']['time_major']
        json.dump(json_, json_file)
    
    # save weights
    model.save_weights('path_to_my_weights.h5')
    
    with CustomObjectScope({'GlorotUniform': glorot_uniform()}):
        coreml_model = coremltools.converters.keras.convert(
            model=('path_to_model_json','path_to_my_weights.h5'),
            input_names=#inputs, 
            output_names=#outputs,
            class_labels = #labels, 
            custom_conversion_functions = { "GlorotUniform": tf.keras.initializers.glorot_uniform
                                                }
        )
        coreml_model.save('my_core_ml_model.mlmodel')
    
    我的解决方案似乎有效,但我想知道是否有更好的方法?或者,这种做法是否存在迫在眉睫的危险?例如,有没有更好的方法将tf.keras模型转换为coreml?还是有更好的方法将tf.keras模型转换为keras?还是有更好的方法,我还没有想到


    关于此事的任何建议都将不胜感激:)

    我觉得你的方法很好

    过去,当我不得不将
    tf.keras
    模型转换为
    keras
    模型时,我做了以下工作:

    • tf.keras中的列车模型
    • 仅保存权重
      tf\u模型。保存权重(“tf\u模型.hdf5”)
    • 使用Keras中的所有层制作Keras模型架构(与tf Keras相同)
    • 按keras中的图层名称加载权重:
      keras\u模型。加载权重(按\u name=True)
    这似乎对我有用。因为我使用的是开箱即用的体系结构(DenseNet169),所以将tf.keras网络复制到keras需要做的工作非常少