当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.quantization.quantize用法及代码示例


将浮点类型的'input'张量量化为'T'类型的'output'张量。

用法

tf.quantization.quantize(
    input, min_range, max_range, T, mode='MIN_COMBINED',
    round_mode='HALF_AWAY_FROM_ZERO', name=None, narrow_range=False,
    axis=None, ensure_minimum_range=0.01
)

参数

  • input Tensor 类型为 float32
  • min_range Tensor 类型为 float32 。量化范围的最小值。这个值可以由op根据其他参数进行调整。调整后的值被写入 output_min 。如果指定了axis 属性,则它必须是大小与输入和输出张量的axis 维度匹配的一维张量。
  • max_range Tensor 类型为 float32 。量化范围的最大值。这个值可以由op根据其他参数进行调整。调整后的值被写入 output_max 。如果指定了axis 属性,则它必须是大小与输入和输出张量的axis 维度匹配的一维张量。
  • T tf.DType 来自:tf.qint8, tf.quint8, tf.qint32, tf.qint16, tf.quint16
  • mode 一个可选的 string 来自: "MIN_COMBINED", "MIN_FIRST", "SCALED" 。默认为 "MIN_COMBINED"
  • round_mode 一个可选的 string 来自: "HALF_AWAY_FROM_ZERO", "HALF_TO_EVEN" 。默认为 "HALF_AWAY_FROM_ZERO"
  • narrow_range 可选的 bool 。默认为 False
  • axis 可选的 int 。默认为 -1
  • ensure_minimum_range 可选的 float 。默认为 0.01
  • name 操作的名称(可选)。

返回

  • Tensor 对象的元组(输出,output_min,output_max)。
  • output Tensor 类型为 T
  • output_min Tensor 类型为 float32
  • output_max Tensor 类型为 float32

[min_range, max_range] 是标量浮点数,用于指定 'input' 数据的范围。 'mode' 属性精确控制用于将浮点值转换为其量化等价物的计算。 'round_mode' 属性控制在将浮点值舍入为其量化等效项时使用哪种舍入 tie-breaking 算法。

在'MIN_COMBINED' 模式下,张量的每个值都会经历以下过程:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8:out[i] -= (range(T) + 1) / 2.0

这里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',那么使用这种方法:

num_discrete_values = 1 << (# of bits in T)
range_adjust = num_discrete_values / (num_discrete_values - 1)
range = (range_max - range_min) * range_adjust
range_scale = num_discrete_values / 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,引入了一个小的偏差,量化和去量化的重复迭代将引入越来越大的误差。

SCALED 模式示例

SCALED 模式与 QuantizeAndDequantize{V2|V3} 中使用的量化方法相匹配。

如果模式是SCALED,则通过将每个输入值乘以scaling_factor来执行量化。 scaling_factor 由min_rangemax_range 确定为尽可能大,以使从min_rangemax_range 的范围可在类型 T 的值内表示。

const int min_T = std::numeric_limits<T>::min();
  const int max_T = std::numeric_limits<T>::max();
  const float max_float = std::numeric_limits<float>::max();

  const float scale_factor_from_min_side =
      (min_T * min_range > 0) ? min_T / min_range:max_float;
  const float scale_factor_from_max_side =
      (max_T * max_range > 0) ? max_T / max_range:max_float;

  const float scale_factor = std::min(scale_factor_from_min_side,
                                      scale_factor_from_max_side);

我们接下来使用scale_factor来调整min_range和max_range如下:

min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

例如如果 T = qint8,并且最初 min_range = -10,并且 max_range = 9,我们会将 -128/-10.0 = 12.8 与 127/9.0 = 14.11 进行比较,并设置 scaling_factor = 12.8 在这种情况下,min_range 将保持 -10,但 max_range 将调整为 127 /12.8 = 9.921875

因此,我们将量化 (-10, 9.921875) 到 (-128, 127) 范围内的输入值。

现在可以通过将值裁剪到 min_rangemax_range 范围内来量化输入张量,然后乘以 scale_factor,如下所示:

result = round(min(max_range, max(min_range, input)) * scale_factor)

调整后的min_rangemax_range 作为此操作的输出 2 和 3 返回。这些输出应用作任何进一步计算的范围。

narrow_range(布尔)属性

如果为真,我们不使用最小量化值。即对于 int8 量化输出,它将被限制在 -127..127 范围内,而不是整个 -128..127 范围内。这是为了与某些推理后端兼容而提供的。 (仅适用于 SCALED 模式)

轴(int)属性

可选的axis 属性可以指定输入张量的维度索引,以便量化范围将被计算并分别应用于沿该维度的张量的每个切片。这对于每通道量化很有用。

如果指定轴,min_range 和 max_range

如果axis =None,则per-tensor量化正常执行。

ensure_minimum_range(浮点数)属性

确保最小量化范围至少是这个值。旧的默认值为 0.01,但强烈建议将其设置为 0 以供新用途。

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.quantization.quantize。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。