如何将Tensorflow.js(.json)模型转换为Tensorflow(SavedModel)或Tensorflow Lite(.tflite)模型?

如何将Tensorflow.js(.json)模型转换为Tensorflow(SavedModel)或Tensorflow Lite(.tflite)模型?,tensorflow,tensorflow-lite,tensorflow.js,tensorflow2,Tensorflow,Tensorflow Lite,Tensorflow.js,Tensorflow2,我有一个来自Google的Tensorflow.js(tfjs)的预先训练过的PoseNet模型,所以它是一个json文件 但是,我想在Android上使用它,所以我需要.tflite模型。虽然有人将类似的模型从tfjs“移植”到tflite,但我不知道他们转换了什么模型(PoseNet有许多变体)。我想自己做这些步骤。另外,我不想运行某些人上传到stackOverflow文件中的任意代码: 注意:小心不可信的代码TensorFlow模型是代码。有关详细信息,请参阅安全使用TensorFlow

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

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

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


有人知道这样做的方便方法吗?

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

从tfjs图形模型到SavedModel(更常见) 被使用

将tfjs\u graph\u converter.api作为tfjs导入
tfjs.graph\u model\u到保存的\u model(
“savedmodel/posenet/mobilenet/float/050/model-stripe16.json”,
“realsavedmodel”
)
#以下代码摘自https://www.tensorflow.org/lite/convert/python_api
converter=tf.lite.TFLiteConverter.from_saved_model(“realsavedmodel”)
tflite_model=converter.convert()
#保存TF Lite模型。
将tf.io.gfile.gfile('model.tflite','wb')作为f:
f、 写入(tflite_模型)

从tfjs层模型到SavedModel 注意:这只适用于图层模型格式,而不是问题中的图形模型格式。我已经写下了它们之间的区别


  • 并使用tensorflowjs convert将
    .json
    文件转换为Keras HDF5文件(从另一个文件)
  • 在mac上,您将面临运行pyenv()的问题,而在Z-shell上,pyenv无法正确加载()。另外,一旦pyenv运行,使用
    python-m pip install tensorflowjs
    而不是
    pip install tensorflowjs
    ,因为pyenv没有为我更改pip使用的python

    一旦您遵循了,运行
    tensorflowjs_converter
    以验证它是否可以正常工作,并且只需警告您
    缺少输入路径参数
    。然后:

    tensorflowjs_converter --input_format=tfjs_layers_model --output_format=keras tfjs_model.json hdf5_keras_model.hdf5
    
  • 使用将Keras HDF5文件转换为保存的模型(标准Tensorflow模型文件)或直接转换为
    .tflite
    文件。以下内容在Python文件中运行:
  • 或保存到已保存的模型:

    # 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_转换器
    无法转换。此GitHub意味着PoseNet模型(如OP引用的模型)的格式为
    tfjs\u graph\u model
    (而非
    tf\u layers\u model
    ),无法转换为KERA。您是如何将PoseNet模型转换为Keras的?复制步骤:运行Docker容器
    python:3.8
    ,然后安装TensorFlow.js
    pip安装tensorflowjs
    ,然后尝试转换
    tensorflowjs\u转换器--input\u format=tfjs\u layers\u model--output\u format=keras/posenet/js/model-strip16.json/posenet/keras/hdf5\u keras\u model.hdf5
    。错误消息:
    File”/usr/local/lib/python3.8/site packages/tensorflow/python/keras/layers/serialization.py”,第101行,在反序列化层class\u name=config['class\u name']keyrorm:'class\u name'
    向Glen道歉,我不知道图形模型和层模型格式之间的区别。我是OP,基本上没有回答我自己的问题。我的答案只适用于
    tfjs\u layers\u model
    无需担心。同时,我找到了一个解决方案,可以将TensorFlow.js图形模型可靠地转换为SavedModel格式。从那里,如果需要的话,获得TF-Lite模型应该非常简单。感谢@Glen,我已经能够创建一个model.tflite,并且已经更新了图形和图层模型格式的答案。
    # 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
    )