【发布时间】:2019-07-02 15:59:59
【问题描述】:
我使用以下代码生成量化的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:
生成的模型将被完全量化,但为方便起见仍采用浮点输入和输出。
要为 Google Coral Edge TPU 编译 tflite 模型,我还需要量化输入和输出。
在模型中,我看到第一个网络层将浮点输入转换为input_uint8,最后一层将output_uint8 转换为浮点输出。
如何编辑 tflite 模型以摆脱第一个和最后一个浮动层?
我知道我可以在转换期间将输入和输出类型设置为 uint8,但这与任何优化都不兼容。唯一可用的选择是使用虚假量化,这会导致模型错误。
【问题讨论】:
-
如果你想要一个完全量化的网络(uint8 输入),那么你必须以不同的方式使用 tflite 转换器。通过 dummy_quantisation,或者使用量化感知训练(包括范围)导出网络并使用它来导出。训练后量化使用 fp32 输入,或者去量化并使用 fp32 内核或动态量化(参考下面的 tf 页面)。 “为了进一步改善延迟,混合算子将激活动态量化为 8 位,并使用 8 位权重和激活执行计算”
-
其实你是对的。即使通过使用校准数据集并捕获输入范围,提取的 tflite 仍然具有 fp32 输入和输出以及训练后量化。只有通过量化感知训练和虚拟量化,您才能提取完全量化的网络(使用 u8 输入 - 输出)。
标签: python tensorflow-lite google-coral