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
)

參見(jiàn)指南:張量變換>分割和連接

將浮點(diǎn)類(lèi)型的 “input” 張量量化為“T”類(lèi)型的 “output” 張量.

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

在 “MIN_COMBINED” 模式中,張量的每個(gè)值將經(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 模式示例:

假設(shè)輸入是 float 類(lèi)型的,并且可能的范圍是 [0.0,6.0],輸出類(lèi)型是 quint8([0,255]).min_range 和 max_range 的值應(yīng)該被指定為 0.0 和 6.0.從 float 到quint8 的量化將把輸入的每個(gè)值乘以 255/6 并轉(zhuǎn)換為 quint8.

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

如果模式是 '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 中,引入了一個(gè)小的偏差,即量化和 dequantizing 的重復(fù)迭代會(huì)引入一個(gè)較大的錯(cuò)誤.

SCALED 模式示例

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

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

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

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

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

接下來(lái),我們選擇我們的定點(diǎn)量化 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 是無(wú)符號(hào)的,則定點(diǎn)范圍是:

[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]

由此我們計(jì)算出我們的比例因子 s:

s = (max_fixed - min_fixed) / (2 * m)

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

result = (input * s).round_to_nearest()

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

參數(shù):

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

返回:

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)