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


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


将 'input' 张量反量化为 float 或 bfloat16 张量。

用法

tf.quantization.dequantize(
    input, min_range, max_range, mode='MIN_COMBINED', name=None,
    axis=None, narrow_range=False, dtype=tf.dtypes.float32
)

参数

  • input 一个Tensor。必须是以下类型之一:qint8 , quint8 , qint32 , qint16 , quint16
  • min_range Tensor 类型为 float32 。可能为输入产生的最小标量值。
  • max_range Tensor 类型为 float32 。可能为输入产生的最大标量值。
  • mode 一个可选的 string 来自: "MIN_COMBINED", "MIN_FIRST", "SCALED" 。默认为 "MIN_COMBINED"
  • narrow_range 可选的 bool 。默认为 False
  • axis 可选的 int 。默认为 -1
  • dtype 一个可选的 tf.DType 来自:tf.bfloat16, tf.float32。默认为 tf.float32 。输出张量的类型。目前 Dequantize 支持 float 和 bfloat16。如果'dtype'为'bfloat16',则只支持'MIN_COMBINED'模式。
  • name 操作的名称(可选)。

返回

  • Tensor 类型为 dtype

[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 模式示例

如果输入来自 QuantizedRelu6,则输出类型为 quint8(范围为 0-255),但 QuantizedRelu6 的可能范围为 0-6。因此,min_range 和 max_range 值为 0.0 和 6.0。 quint8 上的反量化将获取每个值,转换为浮点数,然后乘以 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,则通过将每个输入值乘以scaling_factor来执行去量化。 (因此输入 0 总是映射到 0.0)。

scaling_factor 是从 min_range , max_rangenarrow_range 以与 QuantizeAndDequantize{V2|V3}QuantizeV2 兼容的方式确定的,使用以下算法:

const int min_expected_T = std::numeric_limits<T>::min() +
    (narrow_range ? 1:0);
  const int max_expected_T = std::numeric_limits<T>::max();
  const float max_expected_T = std::numeric_limits<float>::max();

  const float scale_factor =
    (std::numeric_limits<T>::min() == 0) ? (max_range / max_expected_T)
                                        :std::max(min_range / min_expected_T,
                                                    max_range / max_expected_T);

相关用法


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