TensorFlow张量变换函数:tf.quantize_v2
tf.quantize_v2 函数
quantize_v2(
input,
min_range,
max_range,
T,
mode='MIN_COMBINED',
name=None
)
参见指南:张量变换>分割和连接
将浮点类型的 “input” 张量量化为“T”类型的 “output” 张量.
[min_range,max_range]是标量浮点数,它用于指定 “input” 数据的范围.“mode” 属性确定地控制着被用来将浮点值转换为它们的量化等效项的计算.
在 “MIN_COMBINED” 模式中,张量的每个值将经历以下内容:
如果 T == qint8, out[i] -= (range(T) + 1) / 2.0,
那么 out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
其中:range(T) = numeric_limits<T>::max() - numeric_limits<T>::min()
MIN_COMBINED 模式示例:
假设输入是 float 类型的,并且可能的范围是 [0.0,6.0],输出类型是 quint8([0,255]).min_range 和 max_range 的值应该被指定为 0.0 和 6.0.从 float 到quint8 的量化将把输入的每个值乘以 255/6 并转换为 quint8.
如果输出类型为 qint8 ([-128、127]),则操作将在强制转换之前将每个值减去 128,以便值的范围与 qint8 的范围对齐.
如果模式是 'MIN_FIRST',则使用这种方法:
number_of_steps = 1 << (# of bits in T)
range_adjust = number_of_steps / (number_of_steps - 1)
range = (range_max - range_min) * range_adjust
range_scale = number_of_steps / range
quantized = round(input * range_scale) - round(range_min * range_scale) +
numeric_limits<T>::min()
quantized = max(quantized, numeric_limits<T>::min())
quantized = min(quantized, numeric_limits<T>::max())
这和 MIN_COMBINED 最大的区别是最小范围首先四舍五入,然后从舍入值中减去.在 MIN_COMBINED 中,引入了一个小的偏差,即量化和 dequantizing 的重复迭代会引入一个较大的错误.
SCALED 模式示例
SCALED 模式与 QuantizeAndDequantize{V2| V3} 中使用的量化方法相匹配.
如果模式是 SCALED,我们不使用输出类型的全部范围,选择取消对称的最小可能值(例如,输出范围是 -127 到 127,而不是有符号的 8 位量化的 -128 到 127),所以.即 0.0 映射到 0.
我们首先在张量中找到值的范围.我们使用的范围总是以 0 为中心,所以我们找到 m:
m = max(abs(input_min), abs(input_max))
那么我们的输入张量范围是 [-m, m].
接下来,我们选择我们的定点量化 buckets [min_fixed, max_fixed].如果 T 被签名,这是:
num_bits = sizeof(T) * 8
[min_fixed, max_fixed] =
[-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]
否则,如果 T 是无符号的,则定点范围是:
[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]
由此我们计算出我们的比例因子 s:
s = (max_fixed - min_fixed) / (2 * m)
现在我们可以量化张量的元素:
result = (input * s).round_to_nearest()
需要注意的是,在量化过程中,操作员可能会选择稍微调整所需的最小值和最大值,所以您应该始终使用输出端口作为进一步计算的范围.例如,如果所请求的最小值和最大值接近相等,则它们将被分离一个小的 ε 值,以防止形成不规则的量化缓冲区.否则,最终可能会出现缓冲区,其中所有量化值映射到相同的浮点值,这会导致需要对其执行进一步计算的操作出现问题.
参数:
- input:float32 类型的 Tensor.
- min_range:float32 类型的 Tensor.可能为输入生成的最小标量值.
- max_range:float32 类型的 Tensor.可能为输入生成的最大标量值.
- T:tf.DType:来自:tf.qint8、tf.quint8、tf.qint16、tf.quint16、tf.qint32.
- mode:可选的 string,来自:"MIN_COMBINED"、"MIN_FIRST"、"SCALED";默认为:"MIN_COMBINED".
- name:操作的名称(可选).
返回:
Tensor 对象的元组(output,output_min,output_max).
- output:T 类型的 Tensor.从 float 类型输入产生的量化数据.
- output_min:float32 类型的 Tensor.用于输出的实际最小标量值.
- output_max:float32 类型的 Tensor.用于输出的实际最大标量值.