我使用TensorFlow 2.1来训练具有量化感知训练的模型.
这样做的代码是:
import tensorflow_model_optimization as tfmot
model = tfmot.quantization.keras.quantize_annotate_model(model)这将向图中添加假量化节点。这些节点应该调整模型的权重,这样它们就更容易被量化为int8,并且更容易处理int8数据。
当训练结束时,我将模型转换成TF-Lite,如下所示:
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = [give data provider]
quantized_tflite_model = converter.convert()此时,我不希望看到TL-Lite图中的假量化层。但令人惊讶的是,我确实看到了他们。此外,当我在this C++ 样本应用程序中运行这个量化模型时,我看到它在推理过程中也运行假量化节点。此外,它还对各层之间的激活进行了量化和量化。
这是C++代码输出的一个示例:
节点0操作符内置代码80 FAKE_QUANT 投入:1 产出: 237 节点1运算符内置代码114量化 投入: 237 产出: 238 节点2操作员内置代码3 CONV_2D 投入: 238 59 58 产出: 167 临时成员: 378人 节点3运算符内置代码6 DEQUANTIZE 投入: 167 产出: 239 节点4操作员内置代码80 FAKE_QUANT 投入: 239 产出: 166 节点5运算符内置代码114量化 投入: 166 产出: 240 节点6操作员内置代码3 CONV_2D 投入: 240 61 60 产出: 169
所以我觉得所有这些都很奇怪,同时考虑到这个模型应该只在int8上运行,并且实际上假量化节点得到了float32作为输入。
这里的任何帮助都将不胜感激。
发布于 2020-06-22 21:57:56
representative_dataset主要用于训练后量化.
将您的命令与QAT示例进行比较,您可能希望删除该行。
converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_tflite_model = converter.convert()
# Create float TFLite model.
float_converter = tf.lite.TFLiteConverter.from_keras_model(model)
float_tflite_model = float_converter.convert()
# Measure sizes of models.
_, float_file = tempfile.mkstemp('.tflite')
_, quant_file = tempfile.mkstemp('.tflite')
with open(quant_file, 'wb') as f:
f.write(quantized_tflite_model)
with open(float_file, 'wb') as f:
f.write(float_tflite_model)
print("Float model in Mb:", os.path.getsize(float_file) / float(2**20))
print("Quantized model in Mb:", os.path.getsize(quant_file) / float(2**20))发布于 2020-06-26 14:34:31
发布于 2021-02-17 22:36:52
我也遇到过同样的问题。在我的例子中,量化的tflite模型的大小增加了~3倍与假量化。你有没有想过?在Netron中对tflite图的检查表明,在每个操作之间都插入了量化层。
到目前为止,我的解决办法是在没有伪量化的情况下启动新的模型副本,然后从经过量化感知的训练模型中逐层加载权重。由于伪量化层也有参数,所以不能直接对整个模型进行权值设置。
https://stackoverflow.com/questions/62433410
复制相似问题