我很想了解 tensorflow 函数之间的差异

tf.fake_quant_with_min_max_args
tf.fake_quant_with_min_max_vars

就像在他们的 API 中一样,它们的描述几乎相同。
我通常通过 tf.fake_quant_with_min_max_vars 手动量化所需的节点,但我不确定它是否正确。

例如,权重是否应该使用 tf.fake_quant_with_min_max_args

同样,查看 quantize.Quantize 的代码,我确实理解它基本上遍历图形,找到兼容的张量并根据 global_step 添加用于标识/量化的节点。但是,我应该明白并非所有操作都是量化的(例如,conv1d,尽管 conv2d 和 mat/mul 是)。库会支持 future 的所有操作吗?

最佳答案

关于命名,有点用词不当。 'args' 变体使用属性来表示最小值/最大值,因此仅对固定范围有效。 'vars' 变体采用最小/最大的任意张量。这些是实际变量还是其他一些计算值取决于您的量化方法。 “vars”变体的最小值/最大值具有梯度,因此可以进行训练。许多训练方法只是在训练时使用批次的最小值/最大值来计算它们,然后使用指数移动平均将这些累积到不可训练的变量中。然后在评估时,使用最小/最大变量代替计算的最小/最大值。

如果手动添加它们,您需要确保所有算术操作(add、mul 等,但不包括转置、reshape 等)的输入在输入它的张量上具有适当的 fake_quant* 操作。

在实践中,我发现适用于此的规则是:

  • 当权重变量输入算术运算时,添加一个 fake_quant_with_min_max_vars 从权重的最小值/最大值计算其最小值/最大值。
  • 在任何算术运算之后添加一个 fake_quant_with_min_max_vars,该运算在训练时累积到每个运算的专用最小/最大变量中,并在评估时仅使用变量。
  • 将适当的 fake_quant* op 添加到模型的最顶层输入(如果它是通过某种形式的嵌入查找驱动的模型,则不需要)。这包括传入的常量,除非它们是默认范围。

  • 如果你这样做,你通常会处于这样一种情况,即每个张量都被量化而没有冗余/冲突的量化参数。根据模型,可能需要额外的细微差别和其他技巧才能真正使 toco/tflite 能够仅使用量化类型运行它。

    我对执行此操作的自动化工具不太熟悉,但我相信这是他们在重写图形时采用的一般方法。当尝试在 graphdef 级别(与某些事情更明显的源级别相反)进行盲转换时,它们还具有一些显着的复杂性来检测和解决某些需要额外按摩的模式。

    为了让“手动”方法不会太繁重,我编写/使用了一些库,这些库让我通过帮助函数传递重要的张量来注释它们,这些辅助函数遵循模型级参数集,让我可以调整量化策略层按层。

    嗯。

    关于python - tf.fake_quant_with_min_max_args 和 tf.fake_quant_with_min_max_vars 有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50524897/

    10-12 19:06