tf.fake_quant_with_min_max_args 和 tf.fake_quant_with_min_max_vars 有啥区别

Posted

技术标签:

【中文标题】tf.fake_quant_with_min_max_args 和 tf.fake_quant_with_min_max_vars 有啥区别【英文标题】:What are the differences between tf.fake_quant_with_min_max_args and tf.fake_quant_with_min_max_varstf.fake_quant_with_min_max_args 和 tf.fake_quant_with_min_max_vars 有什么区别 【发布时间】:2018-11-04 14:23:03 【问题描述】:

我很想了解 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 是)。库以后会支持所有的操作吗?

【问题讨论】:

【参考方案1】:

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

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

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

    当权重变量输入算术运算时,添加一个 fake_quant_with_min_max_vars,它根据权重的最小值/最大值计算其最小值/最大值。

    在任何算术运算之后添加一个 fake_quant_with_min_max_vars,该运算在训练时累积到每个运算的专用最小/最大变量中,并且仅在评估时使用变量。

    将适当的 fake_quant* 操作添加到模型的最顶层输入(如果它是通过某种形式的嵌入查找驱动的模型,则不需要)。这包括传入的常量,除非它们是默认范围。

如果您以这种方式执行此操作,您通常会处于每个张量都被量化而没有冗余/冲突的量化参数的情况。根据模型的不同,可能需要额外的细微差别和其他技巧才能真正让 toco/tflite 能够仅使用量化类型运行它。

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

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

Hth.

【讨论】:

非常感谢您的精彩回答!

以上是关于tf.fake_quant_with_min_max_args 和 tf.fake_quant_with_min_max_vars 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章