记录一下tensorflow tflite模型训练后量化的操作。
训练后Float16量化
对于一般训练得到的模型,在pb转tflite过程中加入以下代码:
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.lite.constants.FLOAT16]
tflite_quant_model = converter.convert()
在笔者的模型上,模型大小从684K压缩至368K,验证集精度百分数小数点后两位没有差异。
这里主要的一个坑在于,使用tf1.15及以上版本就可以使用上述代码得到量化后的tflite模型,但在python里加载tflite模型时,却会报一个不支持reshape操作的错误。测试下来tf1.15.0到1.15.2都会报错,tf2.0.0也有相同错误,最后使用tf-nightly版本(笔者使用的是tf-nightly-gpu 2.3.0)终于加载成功。
Tensorflow Object Detection Api模型量化
Tensorflow Object Detection Api得到的pb模型有两个,默认名称分别为frozen_inference_graph.pb和tflite_graph.pb,前者用于直接推理,由于输入节点image_tensor的数据类型为uint8,所以不能直接进行float16量化。
在tf1.15及以上版本中, tflite_convert.py的参数有所增加,除了MobileNet SSD V2模型的压缩与tflite格式的转换(补充版) - 简书中所提到的参数以外,新增了 --post_training_quantize和--quantize_to_float16。在将tflite_graph.pb转为tflite模型的过程中中,只要将这两个参数赋值为true即可。
在笔者的模型上,模型大小从580K压缩至346K,验证集精度下降0.05%。