TensorFlow張量變換函數(shù):tf.quantize_v2

2018-11-20 10:28 更新
tf.quantize_v2 函數(shù)
quantize_v2(
    input,
    min_range,
    max_range,
    T,
    mode='MIN_COMBINED',
    name=None
)

參見指南:張量變換>分割和連接

將浮點類型的 “input” 張量量化為“T”類型的 “output” 張量.

[min_range,max_range]是標量浮點數(shù),它用于指定 “input” 數(shù)據(jù)的范圍.“mode” 屬性確定地控制著被用來將浮點值轉(zhuǎn)換為它們的量化等效項的計算.

在 “MIN_COMBINED” 模式中,張量的每個值將經(jīng)歷以下內(nèi)容:

如果 T == qint8, out[i] -= (range(T) + 1) / 2.0,
那么 out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)     

其中: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 并轉(zhuǎn)換為 quint8.

如果輸出類型為 qint8 ([-128、127]),則操作將在強制轉(zhuǎn)換之前將每個值減去 128,以便值的范圍與 qint8 的范圍對齊.

如果模式是 'MIN_FIRST',則使用這種方法:

number_of_steps = 1 << (# of bits in T)
range_adjust = number_of_steps / (number_of_steps - 1)
range = (range_max - range_min) * range_adjust
range_scale = number_of_steps / 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 最大的區(qū)別是最小范圍首先四舍五入,然后從舍入值中減去.在 MIN_COMBINED 中,引入了一個小的偏差,即量化和 dequantizing 的重復迭代會引入一個較大的錯誤.

SCALED 模式示例

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

如果模式是 SCALED,我們不使用輸出類型的全部范圍,選擇取消對稱的最小可能值(例如,輸出范圍是 -127 到 127,而不是有符號的 8 位量化的 -128 到 127),所以.即 0.0 映射到 0.

我們首先在張量中找到值的范圍.我們使用的范圍總是以 0 為中心,所以我們找到 m:

m = max(abs(input_min), abs(input_max))

那么我們的輸入張量范圍是 [-m, m].

接下來,我們選擇我們的定點量化 buckets [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)

現(xiàn)在我們可以量化張量的元素:

result = (input * s).round_to_nearest()

需要注意的是,在量化過程中,操作員可能會選擇稍微調(diào)整所需的最小值和最大值,所以您應該始終使用輸出端口作為進一步計算的范圍.例如,如果所請求的最小值和最大值接近相等,則它們將被分離一個小的 ε 值,以防止形成不規(guī)則的量化緩沖區(qū).否則,最終可能會出現(xiàn)緩沖區(qū),其中所有量化值映射到相同的浮點值,這會導致需要對其執(zhí)行進一步計算的操作出現(xiàn)問題.

參數(shù):

  • input:float32 類型的 Tensor.
  • min_range:float32 類型的 Tensor.可能為輸入生成的最小標量值.
  • max_range:float32 類型的 Tensor.可能為輸入生成的最大標量值.
  • T:tf.DType:來自:tf.qint8、tf.quint8、tf.qint16、tf.quint16、tf.qint32.
  • mode:可選的 string,來自:"MIN_COMBINED"、"MIN_FIRST"、"SCALED";默認為:"MIN_COMBINED".
  • name:操作的名稱(可選).

返回:

Tensor 對象的元組(output,output_min,output_max).

  • output:T 類型的 Tensor.從 float 類型輸入產(chǎn)生的量化數(shù)據(jù).
  • output_min:float32 類型的 Tensor.用于輸出的實際最小標量值.
  • output_max:float32 類型的 Tensor.用于輸出的實際最大標量值.
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號