量化如何以及何时在 TFLite 图中起作用?

Posted

技术标签:

【中文标题】量化如何以及何时在 TFLite 图中起作用?【英文标题】:How and when does quantization work in a TFLite Graph? 【发布时间】:2018-10-20 08:40:48 【问题描述】:

我有一个 TF 模型,它经过量化训练、冻结、使用 TOCO 转换为 tflite,现在我有了 TFLite html 图形模型和 json。

我可以看到,对于我图中的每个张量,每个张量都有量化属性(最小值、最大值、比例、零点),我正在尝试确定这些属性中的每一个如何应用于每个张量。

例如,我理解representation of quantized data,并且我可以理解采用量化的权重/偏差、乘以比例并加上最小值会返回原始权重/偏差(几乎)。

我不明白的:

为什么有些张量有量化属性(如 Relu、Sigmoid)但没有内在参数(如权重和偏差)?是不是因为它们是输出张量,并且在数据输入到下一个操作之前应用了量化? 在模型的数据流期间在哪些点(如果有)应用量化?例如,假设有一个浮点图像张量通过了 conv2d 操作 - weights/bias/relu 的量化属性在哪里以及如何用于获取 conv2d 操作的输出?

本质上,如果我将 TFLite 模型数据解析为一个 numpy 数组,那么我需要了解关于通过网络的数据流(关于量化)的所有信息,以便重新创建模型从头开始推理。

我似乎找不到任何关于此的文档。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

卷积内循环对 uint8 值进行 macc。还有一个较小的外部循环用于计算 macc 的 z 偏移部分。在每个内核卷积结束时,您需要使用 input_scale * kernel_scale / output_scale 的缩减乘数从 int32 累加器缩减到 8 位 uint8 范围。这三个比例值是在训练期间学习的,位于 tflite 推理文件中。本文解释了这些操作。 http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf

【讨论】:

我可以找到input_scalekernel_scale,但是在量化模型中我可以在哪里找到output_scale

以上是关于量化如何以及何时在 TFLite 图中起作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看 .tflite 文件中的权重?

Tensor Flow PB文件量化到TFLITE

TfLite 模型与量化前模型的不同结果

使用 toco 将假量化 tensorflow 模型(.pb)转换为 tensorflow lite 模型(.tflite)失败

循环矢量化以及如何避免它

了解 tf.contrib.lite.TFLiteConverter 量化参数