当前位置: 首页 > 知识库问答 >
问题:

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

谢阳成
2023-03-14

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

哪里

M=S1*S2/S3

S1,S2和S3分别是输入和输出的尺度。

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

根据tensorflow文件:

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

但下面的代码说明了一些不同的情况:

  tensor_utils::BatchQuantizeFloats(
      input_ptr, batch_size, input_size, quant_data, scaling_factors_ptr,
      input_offset_ptr, params->asymmetric_quantize_inputs);
  for (int b = 0; b < batch_size; ++b) {
    // Incorporate scaling of the filter.
    scaling_factors_ptr[b] *= filter->params.scale;
  }

  // Compute output += weight * quantized_input
  int32_t* scratch = GetTensorData<int32_t>(accum_scratch);
  tensor_utils::MatrixBatchVectorMultiplyAccumulate(
      filter_data, num_units, input_size, quant_data, scaling_factors_ptr,
      batch_size, GetTensorData<float>(output), /*per_channel_scale=*/nullptr,
      input_offset_ptr, scratch, row_sums_ptr, &data->compute_row_sums,
      CpuBackendContext::GetFromContext(context));

在这里我们可以看到:

  scaling_factors_ptr[b] *= filter->params.scale;

我认为这意味着:

  1. 计算S1*S2

纸张、文档和代码之间的这种不一致性让我非常困惑。我说不出我错过了什么。有人能帮我吗?

共有1个答案

狄高畅
2023-03-14

让我回答我自己的问题。突然间,我看到了我骑自行车时错过的东西。上面问题中的代码来自函数tFlyte::ops::builtin::fully_connected::EvalHyaux()。这里名字已经说明了一切!矩阵乘法输出中的值在本文第2.2节中表示为r3。根据第2.2节的等式(2),我们有:

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

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

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

 类似资料:
  • 问题内容: 我正在尝试从C#移植算法。我需要做的第一步是获取字节数组的md5。我似乎无法在C#和go实现之间获得一致的哈希值。 在C#中,我可以执行以下操作: 我得到 进行中: 产量: 我是在做一些奇怪的事情,还是实现方式实际上有所不同。我需要能够在旅途中复制C#行为。 我有一些可用的小提琴去和C#的,如果你想检查我的整个实现。 问题答案: 您正在滥用Sum函数的输入。sum的输入参数用于存储输出

  • 在GCM Advanced Topics中,在“为什么不应该很少注销”标题下,有两个关于注册的断言似乎存在冲突。 第一: “regID将应用映射到设备。它与特定登录用户无关。” 我认为映射是一对一的对应(或者应该是)。 第二: “您的应用服务器应维护当前用户和注册ID之间的映射。” 然而,第一项陈述声称没有这种联系。(假定“当前用户”已使用应用服务器“登录”,但文档中未对此进行指定。) 我的问题是

  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 我试图写一个脚本,将信息从一张表复制到另一张表中的Google Sheets,作为每日更新。信息是按行显示的(例如。第5行有我想复制的所有信息,A列是输入的日期)如果条目上的日期(A列)与今天的日期不匹配,那么整行需要转移到另一张床单。 我无法将包含输入信息日期的单元格与今天的日期进行比较,然后捕获该单元格的行号,然后设置要复制的变量。 在新工作表上,它需要扫描下一个空行的范围,然后将信息粘贴到下

  • 我是clojure的新手,尝试通过解https://www.4clojure.com上的问题来学习它。任务是实现flatten函数。这是我的实现: 当我将其作为lein run运行时,我会得到以下异常: 我怀疑它与名称空间有关,但我不知道如何解决它。

  • 本文向大家介绍关于文档,包括了关于文档的使用技巧和注意事项,需要的朋友参考一下 示例 可以记录什么? 各种语言的功能示例。 每个标签的简要介绍。 问题和话题有什么区别? 话题的范围比问题的范围大。由于涉及的文档主题范围太广,因此可以将其关闭。 主题应该有多个示例;一个主题可以用一个示例(例如,一个代码块)满足的请求可能太狭窄了。