【发布时间】:2019-10-24 08:25:56
【问题描述】:
我正在尝试理解 tensorflow 中的量化,我正在关注本教程。
在教程中它说,量化方程是:
- r 是实际值(通常是 float32)
- q 是将其量化表示为 B 位整数(uint8、uint32 等)
- S (float32) 和 z (uint) 是我们缩放和移动数轴的因素。 z 是量化的“零点”,它总是会精确映射回 0.f。
我正在努力理解零点的含义,并希望有人可以用一个例子来解释它?
【问题讨论】:
我正在尝试理解 tensorflow 中的量化,我正在关注本教程。
在教程中它说,量化方程是:
我正在努力理解零点的含义,并希望有人可以用一个例子来解释它?
【问题讨论】:
如果您有带有负数据的值,则零点可以偏移范围。因此,如果您的零点是 128,则未缩放的负值 -127 到 -1 将由 1 到 127 表示,正值 0 到 127 将由 128 到 255 表示。注意 q=0 故意不使用以保持范围对称在两端(因此是 256-1 而不是 256)。
例如给定一个输入张量,其数据范围为 -1000 到 +1000(包括两端),其中一个元素的值为 39.215686275,当使用 128 作为零点时,该元素的量化值为 133:
quantizedValue = round(realValue / scale + zeroPoint) = 133
# So...
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 = 39.215686275
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
【讨论】: