概述
我知道这个话题已经被讨论过很多次了,但我很难理解这个工作流程,或者说,工作流程的各种变化。
例如,假设您正在Windows 10上安装TensorFlow。主要目标是训练一个自定义模型,将其转换为TensorFlow Lite,并将转换后的.tflite文件复制到运行TensorFlow Lite的树莓派上。
对我来说,困惑从转换过程开始。在跟随多个指南后,似乎TensorFlow通常是通过pip或Anaconda安装的。但随后我看到详细的教程,指出需要从源码构建才能将TensorFlow模型转换为TFLite模型。
为了让事情更有趣,我还看到了一些通过Python脚本转换的模型,如这里所示。
问题
到目前为止,我已经看到了三种转换方法,可能是我没有完全理解全貌。以下是我看到的简化方法:
-
从源码构建,并使用TensorFlow Lite优化转换器(TOCO):
bazel run --config=opt tensorflow/lite/toco:toco -- --input_file=$OUTPUT_DIR/tflite_graph.pb --output_file=$OUTPUT_DIR/detect.tflite ...
-
使用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)
-
使用tflite_convert命令行工具:
tflite_convert --saved_model_dir=/tmp/mobilenet_saved_model --output_file=/tmp/mobilenet.tflite
我认为我理解的是选项2/3是相同的,意思是tflite_convert工具已安装,可以从命令行或通过Python脚本调用。但选择一个而不是另一个有什么特定的原因吗?
最后,让我感到困惑的是选项1。也许这是版本问题(1.x vs 2.x)?但TensorFlow Lite优化转换器(TOCO)和TensorFlow Lite转换器之间有什么区别?看起来为了使用TOCO,你必须从源码构建TensorFlow,所以有什么理由你会选择一个而不是另一个吗?
回答:
只要参数保持不变,不同的转换方法的输出没有区别。如果您想以自动化方式生成TFLite模型(例如定期运行的Python脚本),Python API会更好。
TensorFlow Lite优化转换器(TOCO)是TF到TFLite转换器的第一个版本。它最近被废弃,并被一个新转换器所取代,后者可以处理更多的操作/模型。所以我不推荐使用toco:toco
通过bazel,而是使用tflite_convert
,如这里所述。
除非您对转换器进行了一些更改并想测试它们,否则您永远不需要从源码构建转换器。