我正在使用 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 图中看到虚假量化层。但令人惊讶的是,我确实看到了它们。此外,当我在 TF-Lite C++示例应用程序中运行这个量化模型时,我看到它也在推理过程中运行了假量化节点。除此之外,它还对每一层之间的激活进行去量化和量化。
这是 C++ 代码的输出示例:
节点 0 运算符内置代码 80 FAKE_QUANT
输入:1
输出:237
节点 1 运算符内置代码 114 QUANTIZE
输入:237
输出:238
节点 2 运算符内置代码 3 CONV_2D
输入:238 59 58
输出:167
临时:378
节点 3 运算符内置代码 6 DEQUANTIZE
输入:167
输出:239
节点 4 运算符内置代码 80 FAKE_QUANT
输入:239
输出:166
节点 5 运算符内置代码 114 QUANTIZE
输入:166
输出:240
节点 6 运算符内置代码 3 CONV_2D
输入:240 61 60
输出:169
所以我觉得这一切都很奇怪,同时考虑到这个模型应该只在 int8 上运行并且实际上假量化节点将 float32 作为输入。
这里的任何帮助将不胜感激。