Tensorflow量化-零点意味着什么

7eumitmz  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(175)

我正在尝试理解tensorflow 中的量子化,我正在遵循这个教程。
https://heartbeat.fritz.ai/8-bit-quantization-and-tensorflow-lite-speeding-up-mobile-inference-with-low-precision-a882dfcafbbd
在教程中,它说,量化方程是:

  • r为真实的值(通常为float32)
  • q是其量化表示,表示为B位整数(uint8、uint32等)
  • S(float32)和z(uint)是我们缩放和移动数轴的因子。z是量化的“零点”,它总是精确地Map回0.f。

我很难理解零点的含义,希望有人能用例子解释一下?

wooyq4lh

wooyq4lh1#

如果原始数据为负值,则零点可以偏移范围,允许将其存储为无符号整数。因此,如果零点为128,则未缩放的负值-127到-1可以表示为1到127。正值0到127可以用128到255表示。请注意0的量化值(或此处的输入-128)有意不使用,以保持两端的范围对称,因此总范围为256 - 1值,而不是256。
例如,给定数据范围为-1000至+1000(包括两端)的输入Tensor,以及其中值为39.215686275的元素,当使用128作为零点时,该元素的量化值将为133:

quantizedValue = round(realValue / scale + zeroPoint)
quantizedValue = round(39.215686275 / 7.843137255 + 128) = 133
quantizedValue = round(0            / 7.843137255 + 128) = 128
quantizedValue = round(1000         / 7.843137255 + 128) = 255
quantizedValue = round(-1000        / 7.843137255 + 128) = 1

其中:

zeroPoint = 128  ## Note 256/2 is symmetric, and q=0 isn't really used.
                 ## Use same zero point for entire tensor.
scale = (realRangeMaxValue - -realRangeMinValue) / quantizedRange
scale = (1000 - -1000) / 255 = 7.843137255
## Alternately could use inverse scale and multiply above, inverseScale = 0.1275

realRangeMinValue = -1000
realRangeMaxValue = 1000
quantizedRange = 2^8 - 1 = 255
quantizedRangeMinValue = integerRangeMinValue - zeroPoint = -128
quantizedRangeMaxValue = integerRangeMaxValue - zeroPoint = 127

反之:

realValue = (quantizedValue - zeroPoint) * scale
realValue = (133 - 128) * 7.843137255 = 39.215686275
realValue = (128 - 128) * 7.843137255 = 0
realValue = (255 - 128) * 7.843137255 = 1000
realValue = (1   - 128) * 7.843137255 = -1000

相关问题