當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.raw_ops.QuantizeV2用法及代碼示例


將浮點類型的'input'張量量化為'T'類型的'output'張量。

用法

tf.raw_ops.QuantizeV2(
    input, min_range, max_range, T, mode='MIN_COMBINED',
    round_mode='HALF_AWAY_FROM_ZERO', narrow_range=False, axis=-1,
    ensure_minimum_range=0.01, name=None
)

參數

  • 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.raw_ops.QuantizeV2。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。