首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow伪量化层也是从TF-Lite调用的。

TensorFlow伪量化层也是从TF-Lite调用的。
EN

Stack Overflow用户
提问于 2020-06-17 16:07:03
回答 3查看 1.6K关注 0票数 5

我使用TensorFlow 2.1来训练具有量化感知训练的模型.

这样做的代码是:

代码语言:javascript
复制
import tensorflow_model_optimization as tfmot
model = tfmot.quantization.keras.quantize_annotate_model(model)

这将向图中添加假量化节点。这些节点应该调整模型的权重,这样它们就更容易被量化为int8,并且更容易处理int8数据。

当训练结束时,我将模型转换成TF-Lite,如下所示:

代码语言:javascript
复制
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作为输入。

这里的任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2020-06-22 21:57:56

representative_dataset主要用于训练后量化.

将您的命令与QAT示例进行比较,您可能希望删除该行。

示例

代码语言:javascript
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2020-06-26 14:34:31

您可以强制TF只使用INT操作:

代码语言:javascript
复制
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]

如果发生错误,则网络的某些层还没有INT8实现。

此外,您还可以尝试使用内特恩来调查您的网络。

尽管如此,如果您还想拥有INT8输入和输出,则还需要调整这些输入和输出:

代码语言:javascript
复制
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

但是,当前有一个关于输入和输出的未决问题,请参阅第38285期

票数 0
EN

Stack Overflow用户

发布于 2021-02-17 22:36:52

我也遇到过同样的问题。在我的例子中,量化的tflite模型的大小增加了~3倍与假量化。你有没有想过?在Netron中对tflite图的检查表明,在每个操作之间都插入了量化层。

到目前为止,我的解决办法是在没有伪量化的情况下启动新的模型副本,然后从经过量化感知的训练模型中逐层加载权重。由于伪量化层也有参数,所以不能直接对整个模型进行权值设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62433410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档