将浮点类型的'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_range
和max_range
确定为尽可能大,以使从min_range
到max_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_range
到 max_range
范围内来量化输入张量,然后乘以 scale_factor,如下所示:
result = round(min(max_range, max(min_range, input)) * scale_factor)
调整后的min_range
和max_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 以供新用途。
相关用法
- Python tf.quantization.quantize_and_dequantize_v2用法及代码示例
- Python tf.quantization.dequantize用法及代码示例
- Python tf.compat.v1.distributions.Multinomial.stddev用法及代码示例
- Python tf.compat.v1.distribute.MirroredStrategy.experimental_distribute_dataset用法及代码示例
- Python tf.compat.v1.data.TFRecordDataset.interleave用法及代码示例
- Python tf.summary.scalar用法及代码示例
- Python tf.linalg.LinearOperatorFullMatrix.matvec用法及代码示例
- Python tf.linalg.LinearOperatorToeplitz.solve用法及代码示例
- Python tf.raw_ops.TPUReplicatedInput用法及代码示例
- Python tf.raw_ops.Bitcast用法及代码示例
- Python tf.compat.v1.distributions.Bernoulli.cross_entropy用法及代码示例
- Python tf.compat.v1.Variable.eval用法及代码示例
- Python tf.compat.v1.train.FtrlOptimizer.compute_gradients用法及代码示例
- Python tf.distribute.OneDeviceStrategy.experimental_distribute_values_from_function用法及代码示例
- Python tf.math.special.fresnel_cos用法及代码示例
- Python tf.keras.applications.inception_resnet_v2.preprocess_input用法及代码示例
- Python tf.compat.v1.layers.conv3d用法及代码示例
- Python tf.Variable.__lt__用法及代码示例
- Python tf.keras.metrics.Mean.merge_state用法及代码示例
- Python tf.keras.layers.InputLayer用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.quantization.quantize。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。