【问题标题】:How to convert from Tensorflow.js (.json) model into Tensorflow (SavedModel) or Tensorflow Lite (.tflite) model?如何从 Tensorflow.js (.json) 模型转换为 Tensorflow (SavedModel) 或 Tensorflow Lite (.tflite) 模型?
【发布时间】:2020-10-14 02:37:51
【问题描述】:

我有一个 downloaded 来自 Google 的 Tensorflow.js (tfjs) 的预训练 PoseNet 模型,所以它是一个 json 文件。

但是,我想在 Android 上使用它,所以我需要 .tflite 模型。尽管有人将类似的模型从 tfjs 移植到 tflite here,但我不知道他们转换的是什么模型(PoseNet 有很多变体)。我想自己做这些步骤。另外,我不想运行一些有人上传到 stackOverflow 文件中的任意代码:

注意:小心不受信任的代码 - TensorFlow 模型就是代码。有关详细信息,请参阅安全使用 TensorFlow。 Tensorflow docs

有没有人知道任何方便的方法来做到这一点?

【问题讨论】:

    标签: tensorflow tensorflow-lite tensorflow.js tensorflow2


    【解决方案1】:

    您可以通过查看 json 文件找出您的 tfjs 格式。它经常说“图形模型”。它们之间的区别是here

    从 tfjs 图模型到 SavedModel(比较常见)

    Patrick Levin 使用tfjs-to-tf

    import tfjs_graph_converter.api as tfjs
    tfjs.graph_model_to_saved_model(
                   "savedmodel/posenet/mobilenet/float/050/model-stride16.json",
                   "realsavedmodel"
                )
    
    # Code below taken from https://www.tensorflow.org/lite/convert/python_api
    converter = tf.lite.TFLiteConverter.from_saved_model("realsavedmodel")
    tflite_model = converter.convert()
    
    # Save the TF Lite model.
    with tf.io.gfile.GFile('model.tflite', 'wb') as f:
      f.write(tflite_model)
    

    从 tfjs 层模型到 SavedModel

    注意:这仅适用于层模型格式,不适用于问题中的图形模型格式。我写了他们之间的区别here


    1. Install 并使用 tensorflowjs-convert 将 .json 文件转换为 Keras HDF5 文件(来自另一个 SO thread)。

    在 mac 上,您将面临运行 pyenv (fix) 的问题,而在 Z-shell 上,pyenv 将无法正确加载 (fix)。此外,一旦 pyenv 运行,请使用 python -m pip install tensorflowjs 而不是 pip install tensorflowjs,因为 pyenv 并没有为我更改 pip 使用的 python。

    一旦您关注了tensorflowjs_converter guide,运行tensorflowjs_converter 以验证它是否正常工作,并且应该只警告您Missing input_path argument。那么:

    tensorflowjs_converter --input_format=tfjs_layers_model --output_format=keras tfjs_model.json hdf5_keras_model.hdf5
    
    1. 将 Keras HDF5 文件转换为 SavedModel(标准 Tensorflow 模型文件)或使用 TFLiteConverter 直接转换为 .tflite 文件。以下在 Python 文件中运行:
    # Convert the model.
    model = tf.keras.models.load_model('hdf5_keras_model.hdf5')
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert() 
        
    # Save the TF Lite model.
    with tf.io.gfile.GFile('model.tflite', 'wb') as f:
    f.write(tflite_model)
    

    或保存到 SavedModel:

    # Convert the model.
    model = tf.keras.models.load_model('hdf5_keras_model.hdf5')
    tf.keras.models.save_model(
        model, filepath, overwrite=True, include_optimizer=True, save_format=None,
        signatures=None, options=None
    )
    

    【讨论】:

    • 在步骤 1 中,tensorflowjs_converter 无法转换 the PoseNet model。这个 GitHub issue 暗示 PoseNet 模型的格式(例如 OP 引用的那个)是 tfjs_graph_model(不是 tf_layers_model),不能转换为 Keras。您是如何将 PoseNet 模型转换为 Keras 的?
    • 复现步骤:运行Docker容器python:3.8,然后安装TensorFlow.jspip install tensorflowjs,然后尝试转换tensorflowjs_converter --input_format=tfjs_layers_model --output_format=keras /posenet/js/model-stride16.json /posenet/keras/hdf5_keras_model.hdf5。错误信息:File "/usr/local/lib/python3.8/site-packages/tensorflow/python/keras/layers/serialization.py", line 101, in deserialize layer_class_name = config['class_name'] KeyError: 'class_name'
    • 抱歉 Glen,我不知道图模型和层模型格式之间的区别。我是OP,基本上没有回答我自己的问题。我的回答只适用于tfjs_layers_model
    • 不用担心。同时,我在TensorFlow.js Graph Model Converter 找到了一个解决方案,它可以可靠地将 TensorFlow.js 图模型转换为 SavedModel 格式。如果需要,从那里获取 TF Lite 模型应该非常简单。
    • 感谢@Glen,我也已经能够创建一个 model.tflite,并更新了图形和层模型格式的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 2019-05-06
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2019-04-14
    相关资源
    最近更新 更多