参考 tf.quantization - 云+社区 - 腾讯云
目录
三、tf.quantization.fake_quant_with_min_max_args
四、tf.quantization.fake_quant_with_min_max_args_gradient
五、tf.quantization.fake_quant_with_min_max_vars
六、tf.quantization.fake_quant_with_min_max_vars_gradient
七、tf.quantization.fake_quant_with_min_max_vars_per_channel
八、tf.quantization.fake_quant_with_min_max_vars_per_channel_gradient
十、tf.quantization.quantized_concat
十一、tf.quantization.quantize_and_dequantize
tf.quantization的公共API的名称空间。
函数列表:
将“输入”张量去量化为浮点张量。
tf.quantization.dequantize(
input,
min_range,
max_range,
mode='MIN_COMBINED',
name=None
)
[min_range, max_range]是标量浮点数,指定“输入”数据的范围。“mode”属性精确地控制哪些计算用于将浮点值转换为它们的量化等价值。在MIN_COMBINED模式下,张量的每个值都将经历以下过程:
if T == qint8: in[i] += (range(T) + 1)/ 2.0
out[i] = min_range + (in[i]* (max_range - min_range) / range(T))
这里range(T) = numeric_limits<T>::max() - numeric_limits<T>::min()
MIN_COMBINED Mode Example
如果输入来自QuantizedRelu6,输出类型为quint8(范围为0-255),但是QuantizedRelu6的可能范围为0-6。因此min_range和max_range值分别为0.0和6.0。对quint8进行去量化将获得每个值,强制转换为float,并乘以6 / 255。注意,如果quantizedtype是qint8,那么该操作将在强制转换之前将每个值增加128。如果模式为“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 = range / num_discrete_values
const double offset_input = static_cast<double>(input) - lowest_quantized;
result = range_min + ((input - numeric_limits<T>::min()) * range_scale)
SCALED mode Example
缩放模式匹配QuantizeAndDequantize{V2|V3}中使用的量化方法。如果对模式进行缩放,则不使用输出类型的全范围,而是选择省略对称的最小可能值(例如,输出范围是-127到127,而符号8位量化的输出范围不是-128到127),因此0.0映射到0。我们首先找到张量的值域。我们使用的范围总是以0为中心,所以我们找到m是这样的
m = max(abs(input_min), abs(input_max))
我们的输入张量范围是[-m, m]。接下来,我们选择定点量化桶[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 = (2 * m) / (max_fixed - min_fixed)
现在我们可以对张量的元素去量化:
result = input * s
参数:
input
:一个张量。必须是下列类型之一:qint8, quint8, qint32, qint16, quint16。mode
:可选字符串:“MIN_COMBINED”、“MIN_FIRST”、“scale”。默认为“MIN_COMBINED”。返回值:
假量化“输入”张量,类型浮动到相同类型的“输出”张量。
tf.quantization.fake_quant_with_min_max_args(
inputs,
min=-6,
max=6,
num_bits=8,
narrow_range=False,
name=None
)
属性(最小值;max]定义输入数据的夹紧范围。输入值量子化为量子化范围([0;2^num_bits - 1]当narrow_range为false且[1;2^num_bits - 1]当为真时),然后反量化,输出为浮点数[min;max)间隔。num_bits是量化的位宽;2到16之间,包括在内。在量化之前,使用以下逻辑调整min和max值。建议取min <= 0 <= max。如果0不在值的范围内,则可能出现意外行为:如果0 < min < max: min_adj = 0和max_adj = max - min.如果min < max < 0: min_adj = min - max和max_adj = 0。如果min <= 0 <= max: scale = (max - min) / (2^num_bits - 1), min_adj = scale * round(min / scale)和max_adj = max + min_adj - min。
参数:
inputs
:类型为float32的张量。narrow_range
:一个可选的bool。默认值为False。返回值:
为FakeQuantWithMinMaxArgs操作计算梯度。
tf.quantization.fake_quant_with_min_max_args_gradient(
gradients,
inputs,
min=-6,
max=6,
num_bits=8,
narrow_range=False,
name=None
)
参数:
gradients
:一个浮点32的张量。FakeQuantWithMinMaxArgs操作之上的反向传播梯度。inputs
:类型为float32的张量。作为输入传递给FakeQuantWithMinMaxArgs操作的值。narrow_range
:一个可选的bool。默认值为False。返回值:
通过全局浮点标量min对浮点类型的“输入”张量进行伪量化
tf.quantization.fake_quant_with_min_max_vars(
inputs,
min,
max,
num_bits=8,
narrow_range=False,
name=None
)
和输出张量的最大值,输出张量的形状与输入张量相同。max]定义输入数据的夹紧范围。输入值量子化为量子化范围([0;2^num_bits - 1]当narrow_range为false且[1;2^num_bits - 1]当为真时),然后反量化,输出为浮点数[min;max)间隔。num_bits是量化的位宽;2到16之间,包括在内。在量化之前,使用以下逻辑调整min和max值。建议取min <= 0 <= max。如果0不在值的范围内,则可能出现意外行为:如果0 < min < max: min_adj = 0和max_adj = max - min.如果min < max < 0: min_adj = min - max和max_adj = 0。如果min <= 0 <= max: scale = (max - min) / (2^num_bits - 1), min_adj = scale * round(min / scale)和max_adj = max + min_adj - min。
参数:
inputs
:类型为float32的张量。min
:一个浮点32的张量。narrow_range
:一个可选的bool。默认值为False。返回值:
为FakeQuantWithMinMaxVars操作计算梯度。
tf.quantization.fake_quant_with_min_max_vars_gradient(
gradients,
inputs,
min,
max,
num_bits=8,
narrow_range=False,
name=None
)
参数:
gradients
:一个浮点32的张量。FakeQuantWithMinMaxVars操作之上的反向传播梯度。inputs
:类型为float32的张量。作为输入传递给FakeQuantWithMinMaxVars操作的值。最小,最大:量子化区间,标量浮点数。narrow_range
:一个可选的bool。默认值为False。是否量化为2^num_bits - 1个不同的值。返回值:
张量对象的元组(backprops_wrt_input、backprop_wrt_min、backprop_wrt_max)。
对float类型的“输入”张量进行伪量化,其中一个形状为:[d],
tf.quantization.fake_quant_with_min_max_vars_per_channel(
inputs,
min,
max,
num_bits=8,
narrow_range=False,
name=None
)
[b, d] [b, h, w, d]通过每个通道将形状的min和max浮动到与输入形状相同的‘输出’张量。max]定义输入数据的夹紧范围。输入值量子化为量子化范围([0;2^num_bits - 1]当narrow_range为false且[1;2^num_bits - 1]当为真时),然后反量化,输出为浮点数[min;max)间隔。num_bits是量化的位宽;2到16之间,包括在内。在量化之前,使用以下逻辑调整min和max值。建议取min <= 0 <= max。如果0不在值的范围内,则可能出现意外行为:如果0 < min < max: min_adj = 0和max_adj = max - min.如果min < max < 0: min_adj = min - max和max_adj = 0。如果min <= 0 <= max: scale = (max - min) / (2^num_bits - 1), min_adj = scale * round(min / scale)和max_adj = max + min_adj - min。
参数:
inputs
:类型为float32的张量。min
:一个浮点32的张量。narrow_range
:一个可选的bool。默认值为False。返回值:
为FakeQuantWithMinMaxVarsPerChannel操作计算梯度。
tf.quantization.fake_quant_with_min_max_vars_per_channel_gradient(
gradients,
inputs,
min,
max,
num_bits=8,
narrow_range=False,
name=None
)
参数:
gradients
:一个浮点32的张量。FakeQuantWithMinMaxVars操作上方的反向传播梯度,形状为:[d]、[b, d]、[b, h, w, d]。inputs
:类型为float32的张量。作为输入传递给FakeQuantWithMinMaxVars操作的值,其形状与梯度相同。min, max:量化区间,形状浮点数[d]。min
:一个浮点32的张量。narrow_range
:一个可选的bool。默认值为False。是否量化为2^num_bits - 1个不同的值。返回值:
张量对象的元组(backprops_wrt_input、backprop_wrt_min、backprop_wrt_max)。
将浮点型的“输入”张量量子化为“T”型的“输出”张量。
tf.quantization.quantize(
input,
min_range,
max_range,
T,
mode='MIN_COMBINED',
round_mode='HALF_AWAY_FROM_ZERO',
name=None
)
[min_range, max_range]是标量浮点数,指定“输入”数据的范围。“mode”属性精确地控制哪些计算用于将浮点值转换为它们的量化等价值。“round_mode”属性控制当将浮点值舍入到量子化的等价值时,使用哪种舍入打结算法。在MIN_COMBINED模式下,张量的每个值都将经历以下过程:
out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0
这里ic_limits<T>::max() - numeric_limits<T>::min()
MIN_COMBINED Mode Example
假设输入类型为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 mode Example
缩放模式匹配QuantizeAndDequantize{V2|V3}中使用的量化方法。如果对模式进行缩放,则不使用输出类型的全范围,而是选择省略对称的最小可能值(例如,输出范围是-127到127,而符号8位量化的输出范围不是-128到127),因此0.0映射到0。我们首先找到张量的值域。我们使用的范围总是以0为中心,所以我们找到m是这样的
m = max(abs(input_min), abs(input_max))
我们的输入张量范围是[-m, m]。接下来,我们选择定点量化桶[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 = round(input * s)
需要注意的一件事是,在量化过程中,操作符可能会选择稍微调整请求的最小值和最大值,所以应该始终使用输出端口作为进一步计算的范围。例如,如果请求的最小值和最大值接近相等,它们将被一个小的epsilon值分隔,以防止创建格式不良的量子化缓冲区。否则,您可能会得到所有量子化值都映射到相同浮点值的缓冲区,这将导致必须对其执行进一步计算的操作出现问题。
参数:
input
:类型为float32的张量。返回值:
张量对象的元组(输出,output_min, output_max)。
沿一维串联量子化张量。
tf.quantization.quantized_concat(
concat_dim,
values,
input_mins,
input_maxes,
name=None
)
参数:
values
:包含至少两个具有相同类型的张量对象的列表。要连接的N个张量。它们的级别和类型必须匹配,它们的大小必须在除concat_dim之外的所有维度上匹配。返回值:
张量对象的元组(输出,output_min, output_max)。
量子化然后去量子化一个张量。
tf.quantization.quantize_and_dequantize(
input,
input_min,
input_max,
signed_input=True,
num_bits=8,
range_given=False,
round_mode='HALF_TO_EVEN',
name=None,
narrow_range=False
)
参数:
input
:一个量子化和去量子化的张量。返回值: