TensorFlow Lite 从入门到
放弃
精通
TensorFlow Lite 采坑记(二):模型转换初探
本片主要分两部分:第一部分以为tflite_convert
为例(TF版本需>=1.9)介绍模型转换的相关细节;第二部分浅显地谈一下对TF Lite中模型转换的理解
1. tflite_convert:
如上图,TFLite Converter可以将高阶API:tf.Keras
和tf.Estimator
保存的模型直接转换为.tflite的格式,这里笔者的理解是理论上绝大多数的模型都可以被转为.tflite的形式,即转换成TFLite FlatBuffer,但是否可以被TFlite interpreter接受取决于operators兼容性(结论待验证)。对于保存成GraphDef+Checkpoints形式的模型,可以用官方脚本freeze_graph.py来保存成.pb文件再进行转换。
以文档中提到的tflite_convert命令行为例:
- 首先下载由预训练过模型生成的.pb文件
- 由于模型的构建过程我们并不清楚,而tflite_convert命令行需要
--input_arrays
和--output_arrays
两个重要的参数,现利用官方提供的脚本工具import_pb_to_tensorboard.py进行.pb文件的可视化,从而确定input array和output array。(注:tensorflow版本需>=0.12)
cd 到脚本所在目录,运行:
python import_pb_to_tensorboard.py --model_dir path/to/.pb --log_dir /tmp/tensorflow_logdir
<snip>
Model Imported. Visualize by running: tensorboard --logdir=/tmp/tensorflow_logdir
tensorboard --logdir=/tmp/tensorflow_logdir
得到Graph:
由此可见–input_array=input, --output_array=output
接着利用命令行转换:
tflite_convert \
--output_file=/tmp/foo.tflite \
--graph_def_file=/tmp/your_model.pb \
--input_arrays=input_node \
--output_arrays=output_node
提示需要提供input array的shape
回到tensorboard, 双击input,得到其output shape为:?x28x28x1
但是这个是Reshape之后的结果,在查阅一些资料后发现input shape还是无法确定,最后参照官方文档中的例子,尝试输入 --input_shape=1,28,28,转换成功…
注意:获得的.tflite文件大小不变,与之前.pb文件一样
2. 大致流程
相关链接:
Post-training quantization:
https://www.tensorflow.org/lite/performance/post_training_quantization
Keras api(Weight Pruning):
https://www.tensorflow.org/model_optimization/guide/pruning/pruning_with_keras
Quantization-aware training
https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantize
Customize ops
https://heartbeat.fritz.ai/compiling-a-tensorflow-lite-build-with-custom-operations-cf6330ee30e2