我很想了解张量流函数之间的差异
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)。图书馆将来会支持所有的操作吗?
答案 0 :(得分:3)
关于命名,这有点用词不当。 'args'变体使用属性来表示最小/最大值,因此仅对固定范围有效。 'vars'变体采用最小/最大的任意张量。这些是实际变量还是其他计算值取决于您的量化方法。 'vars'变体具有最小/最大的渐变,因此可以训练。许多训练方法只是在训练时使用批次的最小值/最大值计算它们,然后使用指数移动平均值将它们累积到不可训练的变量中。然后在eval时间,使用最小/最大变量代替计算的最小值/最大值
如果手动添加它们,您需要确保所有算术运算的输入(add,mul等,但不是转置,重塑等)在输入的张量上有适当的fake_quant * op。 / p>
在实践中,我发现适用于此的规则是:
当权重变量输入算术运算时,添加一个fake_quant_with_min_max_vars,根据权重的最小值/最大值计算其最小值/最大值。
在训练时为每个操作系统累积到专用的最小/最大变量的算术运算后添加一个fake_quant_with_min_max_vars,并在eval时间使用变量。
在模型的最顶层输入中添加一个合适的fake_quant * op(如果是通过某种形式的嵌入查找驱动的模型,则不需要)。这包括常量进入,除非它们是默认范围。
如果以这种方式进行,您通常会处于每个张量都被量化而没有冗余/冲突的量子参数的情况。根据模型的不同,可能需要额外的细微差别和其他技巧才能真正让toco / tflite能够仅使用量化类型来运行它。
我不太熟悉这样做的自动化工具,但我相信这是他们在重写图表时采用的一般方法。当尝试在graphdef级别盲目进行转换时,它们还具有一些显着的复杂性来检测和解决某些需要额外按摩的模式(与某些事情更明显的源级别相反)。
对于“手动”的方法,不要太繁琐,我编写/使用的库只是让我通过辅助函数传递它们注释重要的张量,这些函数遵循模型级参数集,让我调整量化策略逐层。
H个。