关于tensorflow lite量化代码、纸张和文档之间不一致的问题
在google发表的论文(仅用于有效整数算术推理的神经网络量化和训练)中,量化方案描述如下: 在哪里, M=S1*S2/S3 S1、S2和S3分别是输入和输出的刻度 S1(和零点Z1)和S2(和零点Z2)均可轻松确定,无论是“离线”还是“在线”。但是S3(和零点Z3)呢?这些参数取决于“实际”输出刻度(即关于tensorflow lite量化代码、纸张和文档之间不一致的问题,tensorflow,tensorflow-lite,quantization,Tensorflow,Tensorflow Lite,Quantization,在google发表的论文(仅用于有效整数算术推理的神经网络量化和训练)中,量化方案描述如下: 在哪里, M=S1*S2/S3 S1、S2和S3分别是输入和输出的刻度 S1(和零点Z1)和S2(和零点Z2)均可轻松确定,无论是“离线”还是“在线”。但是S3(和零点Z3)呢?这些参数取决于“实际”输出刻度(即float无量化值)。但输出规模在计算之前是未知的 根据tensorflow: 在推理时,权重从8位精度转换为浮点,并使用浮点内核计算。此转换只执行一次并缓存以减少延迟 但下面的说法有所不同:
float
无量化值)。但输出规模在计算之前是未知的
根据tensorflow:
在推理时,权重从8位精度转换为浮点,并使用浮点内核计算。此转换只执行一次并缓存以减少延迟
但下面的说法有所不同:
张量函数::BatchQuantizeFloats(
输入\u ptr、批量大小、输入大小、数量数据、比例因子\u ptr、,
输入偏移量,参数->非对称量化输入);
对于(int b=0;bscaling\u factors\u ptr[b]*=filter->params.scale;
我认为这意味着:
纸张、文档和代码之间的这种不一致性让我非常困惑。我说不出我错过了什么。有人能帮我吗?让我回答我自己的问题。突然,我看到了我年轻时错过的东西 骑自行车。上述问题中的代码来自函数
tflite::ops::builtin::完全连接::EvalHybrid()
。这是
名字解释了一切!矩阵乘法输出中的值为
在本文第2.2节中表示为r3。根据方程式
(2) 在第2.2节中,我们有:
如果我们想要得到矩阵乘法的浮点结果,我们可以使用第2.2节中的等式(4),然后将结果转换回浮点,或者我们可以使用等式(3),左侧替换为r3,如:
如果我们选择所有零点为0
,则上述公式为:
这正是EvalHybrid()
所做的(暂时忽略偏差)。结果表明,本文给出了量化算法的概要,而实现使用了不同的变体