将 .pb 文件转换为 .tflite 的工作流程

Workflow for converting .pb files to .tflite

概览

我知道这个主题已被讨论过很多次,但我很难理解工作流程,或者更确切地说,工作流程的变体。

例如,假设您要在 Windows10 上安装 TensorFlow。主要目标是训练自定义模型,转换为 TensorFlow Lite,并将转换后的 .tflite 文件复制到 Raspberry Pi 运行 TensorFlow Lite。

我的困惑始于转换过程。在遵循多个指南之后,TensorFlow 似乎通常使用 pip 或 Anaconda 安装。但后来我看到 detailed tutorials 表明它需要从源代码构建才能从 TensorFlow 模型转换为 TFLite 模型。

为了让事情更有趣,我还看到了通过 Python 脚本转换的模型 as seen here

问题

到目前为止,我已经看到了 3 种进行这种转换的方法,可能只是我没有掌握全貌。以下是我见过的简写方法:

  1. 从源代码构建,并使用 TensorFlow Lite 优化转换器 (TOCO):

    bazel run --config=opt tensorflow/lite/toco:toco -- --input_file=$OUTPUT_DIR/tflite_graph.pb --output_file=$OUTPUT_DIR/detect.tflite ...

  2. 使用 TensorFlow Lite 转换器 Python API:

    converter = tf.lite.TFLiteConverter.from_saved_model(export_dir)
    tflite_model = converter.convert()
    
    with tf.io.gfile.GFile('model.tflite', 'wb') as f:
    f.write(tflite_model)
    
  3. 使用 tflite_convert CLI 实用程序:

    tflite_convert --saved_model_dir=/tmp/mobilenet_saved_model --output_file=/tmp/mobilenet.tflite

我*认为我理解选项 2/3 是相同的,因为安装了 tflite_convert 实用程序,并且可以从命令行或通过 Python 脚本。但是,您应该选择一个而不是另一个的具体原因是什么?

最后,真正让我感到困惑的是选项 1。也许是版本问题(1.x 与 2.x)?但是 TensorFlow Lite 优化转换器 (TOCO) 和 TensorFlow Lite 转换器之间有什么区别。似乎为了使用 TOCO,您必须从源代码构建 TensorFlow,那么您有理由使用一个而不是另一个吗?

只要参数保持不变,不同的转换方式输出的结果是没有区别的。如果您想以自动方式生成 TFLite 模型,Python API 更好(例如 Python 定期 运行 的脚本)。

TensorFlow Lite 优化转换器 (TOCO) 是 TF->TFLite 转换器的第一个版本。它最近被弃用并替换为 new converter that can handle more ops/models. So I wouldn't recommend using toco:toco via bazel, but rather use tflite_convert as mentioned here.

你不应该从源代码构建转换器,除非你正在对其进行一些更改并想要测试它们。