將浮點類型的'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_range
和max_range
確定為盡可能大,以使從min_range
到max_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_range
到 max_range
範圍內來量化輸入張量,然後乘以 scale_factor,如下所示:
result = round(min(max_range, max(min_range, input)) * scale_factor)
調整後的min_range
和max_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 以供新用途。
相關用法
- Python tf.raw_ops.QuantizedMatMulWithBiasAndReluAndRequantize用法及代碼示例
- Python tf.raw_ops.QuantizedReshape用法及代碼示例
- Python tf.raw_ops.QuantizedMatMulWithBias用法及代碼示例
- Python tf.raw_ops.QuantizedMatMulWithBiasAndRelu用法及代碼示例
- Python tf.raw_ops.Qr用法及代碼示例
- Python tf.raw_ops.TPUReplicatedInput用法及代碼示例
- Python tf.raw_ops.Bitcast用法及代碼示例
- Python tf.raw_ops.SelfAdjointEigV2用法及代碼示例
- Python tf.raw_ops.BatchMatMul用法及代碼示例
- Python tf.raw_ops.OneHot用法及代碼示例
- Python tf.raw_ops.ResourceScatterNdSub用法及代碼示例
- Python tf.raw_ops.ReadVariableXlaSplitND用法及代碼示例
- Python tf.raw_ops.GatherV2用法及代碼示例
- Python tf.raw_ops.Expm1用法及代碼示例
- Python tf.raw_ops.BitwiseAnd用法及代碼示例
- Python tf.raw_ops.UniqueWithCounts用法及代碼示例
- Python tf.raw_ops.DecodeGif用法及代碼示例
- Python tf.raw_ops.Size用法及代碼示例
- Python tf.raw_ops.ScatterUpdate用法及代碼示例
- Python tf.raw_ops.ParallelConcat用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.raw_ops.QuantizeV2。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。