阅读(4922) (10)

TensorFlow张量变换函数:tf.quantize_v2

2017-11-17 11:05:19 更新
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.用于输出的实际最大标量值.