tf.fake_quant_with_min_max_args和tf.fake_quant_with_min_max_vars之间有什么区别?

4
我很乐意帮您理解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代码,我理解它基本上是遍历图形,查找兼容张量,并根据全局步骤添加标识 / 量化节点。但是,我应该了解到并非所有操作都被量化(例如conv1d,尽管conv2d和mat/mul是)。该库是否将来支持所有操作?
1个回答

5
关于命名,这有点不准确。'args' 变体使用属性来表示最小/最大值,因此仅适用于固定范围。'vars' 变体接受任意张量作为最小/最大值。它们是实际变量还是其他计算值取决于您的量化方法。'vars' 变体具有其最小/最大值的梯度,因此可以进行训练。许多训练方法在训练时仅计算批次的最小/最大值,并使用指数移动平均将它们累积到不可训练的变量中。然后在评估时间,最小/最大变量被用来代替计算得出的最小/最大值。
如果要手动添加它们,则需要确保所有算术运算(加法、乘法等,但不包括转置、重塑等)的输入张量上都有适当的 fake_quant* 操作。
实践中,我发现以下规则适用于此:
1. 当权重变量输入算术运算时,添加一个 fake_quant_with_min_max_vars,该操作从权重的最小/最大值计算出它的最小/最大值。 2. 在任何在训练时累积到专用最小/最大变量的算术运算之后添加一个 fake_quant_with_min_max_vars,并且在评估时仅使用变量。 3. 在您的模型的最顶层输入中添加适当的 fake_quant* 操作(如果它是通过某种嵌入查找驱动的模型,则不需要)。这包括输入常量,除非它们是默认范围。
如果按照此方式操作,则通常会出现每个张量都被量化且没有冗余/冲突的量化参数的情况。根据模型,还可能需要其他微妙之处和其他技巧才能真正让 toco/tflite 只使用量化类型来运行它。
我对自动化工具不太熟悉,但我认为在重写图形时,它们采用的是一般方法。当尝试在图形定义级别上进行转换(而不是源级别,在源级别上有些事情更加明显)时,它们还有一些重要的复杂性来检测和解决某些需要额外调整的模式。
为了使“手动”方法不太繁琐,我编写/使用了库,只需通过将它们传递到帮助函数中即可注释重要的张量,这些函数将延迟到一组模型级参数,让我逐层调整量化策略。
希望有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接