关于tensorflow lite量化代码、纸张和文档之间不一致的问题

关于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位精度转换为浮点,并使用浮点内核计算。此转换只执行一次并缓存以减少延迟 但下面的说法有所不同:

在google发表的论文(仅用于有效整数算术推理的神经网络量化和训练)中,量化方案描述如下:

在哪里,

M=S1*S2/S3

S1、S2和S3分别是输入和输出的刻度

S1(和零点Z1)和S2(和零点Z2)均可轻松确定,无论是“离线”还是“在线”。但是S3(和零点Z3)呢?这些参数取决于“实际”输出刻度(即
float
无量化值)。但输出规模在计算之前是未知的

根据tensorflow:

在推理时,权重从8位精度转换为浮点,并使用浮点内核计算。此转换只执行一次并缓存以减少延迟

但下面的说法有所不同:

张量函数::BatchQuantizeFloats( 输入\u ptr、批量大小、输入大小、数量数据、比例因子\u ptr、, 输入偏移量,参数->非对称量化输入); 对于(int b=0;b参数比例; } //计算输出+=权重*量化输入 int32_t*scratch=GetTensorData(累计scratch); 张量:矩阵BatchVectorMultiplyAccumulate( 过滤数据、数量单位、输入大小、数量数据、比例系数、, 批次大小,GetTensorData(输出),/*每通道比例=*/nullptr, 输入\u offset\u ptr、scratch、row\u summes\u ptr和&data->计算\u row\u summes, CpuBackendContext::GetFromContext(context)); 在这里我们可以看到:

scaling\u factors\u ptr[b]*=filter->params.scale;
我认为这意味着:

  • 计算S1×S2
  • 权重仍然是整数。只是最终结果是浮动
  • 似乎S3和Z3不需要计算。但如果是这样,最终的浮点结果如何接近未量化的结果

  • 纸张、文档和代码之间的这种不一致性让我非常困惑。我说不出我错过了什么。有人能帮我吗?让我回答我自己的问题。突然,我看到了我年轻时错过的东西 骑自行车。上述问题中的代码来自函数
    tflite::ops::builtin::完全连接::EvalHybrid()
    。这是 名字解释了一切!矩阵乘法输出中的值为 在本文第2.2节中表示为r3。根据方程式 (2) 在第2.2节中,我们有:

    如果我们想要得到矩阵乘法的浮点结果,我们可以使用第2.2节中的等式(4),然后将结果转换回浮点,或者我们可以使用等式(3),左侧替换为r3,如:

    如果我们选择所有零点为
    0
    ,则上述公式为:

    这正是
    EvalHybrid()
    所做的(暂时忽略偏差)。结果表明,本文给出了量化算法的概要,而实现使用了不同的变体