我使用下面的代码生成一个量化的tflite模型
import tensorflow as tf
def representative_dataset_gen():
for _ in range(num_calibration_steps):
# Get sample input data as a numpy array in a method of your choosing.
yield [input]
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
tflite_quant_model = converter.convert()
根据post training quantization:
结果模型将被完全量化,但为了方便起见,仍然采用浮点输入和输出。
要编译tflite模型谷歌珊瑚边缘TPU我需要量化的输入和输出以及。
在模型中,我看到第一个网络层将float输入转换为input_uint8
,最后一个层将output_uint8
转换为float输出。如何编辑tflite模型以摆脱第一个和最后一个float层?
我知道我可以在转换过程中将输入和输出类型设置为uint8,但这与任何优化都不兼容。唯一可用的选择是使用假量化,这会导致糟糕的模型。
3条答案
按热度按时间q0qdq0h21#
你可以通过将inference_input_type和inference_output_type(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/python/lite.py#L460-L476)设置为int 8来避免浮点数变成int 8和int 8变成浮点数“quant/dequant”操作。
flvtvl502#
bf1o4zei3#
这一点:
生成具有Float32输入和输出的Float32模型。这:
生成具有UINT8输入和输出的UINT8模型
您可以通过以下方式确保这一点:
其返回:
如果你想要一个完整的UINT8量化,你可以通过使用
netron
可视化地检查你的模型来进行双重检查