tensorflow:: ops:: QuantizeV2
#include <array_ops.h>float型の「input」テンソルを、T型の「output」テンソルに量子化します。
まとめ
[min_range、max_range]は、入力データの範囲を指定するスカラー浮動小数点数です。「mode」属性は、浮動小数点値を量子化された値に変換するために使用する計算方法を正確に制御します。「round_mode」属性は、浮動小数点値を量子化された値に丸める際に使用する丸めタイブレークアルゴリズムを制御します。
「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
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::min() quantized = max(quantized, numeric_limits ::min()) quantized = min(quantized, numeric_limits ::max())
これとMIN_COMBINEDの最大の違いは、最小範囲が最初に丸められ、その後丸められた値から減算される点です。MIN_COMBINEDでは、量子化と逆量子化を繰り返すことで誤差が徐々に大きくなるという小さなバイアスが生じます。
スケーリングモードの例
SCALEDモードはQuantizeAndDequantize{V2|V3}で使用される量子化アプローチと一致します。
モードがSCALEDの場合、量子化は各入力値をスケーリング係数で乗算することによって行われます。スケーリング係数は、 min_rangeからmax_rangeまでの範囲が型Tの値で表現できる範囲になるように、 min_rangeとmax_rangeから可能な限り大きな値となるように決定されます。
const int min_T = std::numeric_limits::min(); const int max_T = std::numeric_limits ::max(); const float max_float = std::numeric_limits ::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 の場合、量子化出力は -128~127 の範囲ではなく、-127~127 の範囲に制限されます。これは、特定の推論バックエンドとの互換性のために提供されています。(SCALED モードのみに適用されます)
軸(整数)属性
オプションのaxis属性を使用すると、入力テンソルの次元インデックスを指定できます。これにより、量子化範囲が、その次元に沿ったテンソルの各スライスごとに個別に計算され、適用されます。これは、チャネルごとの量子化に役立ちます。
軸が指定されている場合、min_range と max_range
axis = None の場合、テンソルごとの量子化は通常どおり実行されます。
ensure_minimum_range (float) 属性
最小量子化範囲がこの値以上であることを保証します。従来のデフォルト値は0.01ですが、新規で使用する場合は0に設定することを強くお勧めします。
議論:
- スコープ:スコープオブジェクト
- min_range: 量子化範囲の最小値。この値は、他のパラメータに応じて演算によって調整される場合があります。調整後の値は
output_minに書き込まれます。axis 属性が指定されている場合、これはaxisテンソルと出力テンソルのaxis次元に一致するサイズの 1 次元テンソルである必要があります。 - max_range: 量子化範囲の最大値。この値は、他のパラメータに応じて演算によって調整される場合があります。調整後の値は
output_maxに書き込まれます。axis 属性が指定されている場合、これはaxisテンソルと出力テンソルのaxis次元に一致するサイズの 1 次元テンソルである必要があります。
返品:
-
Output:浮動小数点入力から生成された量子化データ。 -
Outputoutput_min: 入力値をスケーリングおよび丸めて量子化値にする前にクリップするために使用される、最終的な量子化範囲の最小値。axis属性が指定されている場合、これはaxisテンソルと出力テンソルのaxis次元に一致するサイズの1次元テンソルになります。 -
Outputoutput_max: 入力値をスケーリングおよび丸めて量子化値にする前にクリップするために使用される、最終的な量子化範囲の最大値。axis属性が指定されている場合、これはaxisテンソルと出力テンソルのaxis次元に一致するサイズの1次元テンソルになります。
コンストラクターとデストラクタ | |
|---|---|
QuantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input min_range, :: tensorflow::Input max_range, DataType T) | |
QuantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input min_range, :: tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs) |
公開属性 | |
|---|---|
operation | |
output | |
output_max | |
output_min | |
パブリック静的関数 | |
|---|---|
Axis (int64 x) | |
EnsureMinimumRange (float x) | |
Mode (StringPiece x) | |
NarrowRange (bool x) | |
RoundMode (StringPiece x) | |
構造 | |
|---|---|
| tensorflow:: ops:: QuantizeV2:: Attrs | QuantizeV2のオプション属性設定子。 |
公開属性
手術
Operation operation
出力
::tensorflow::Output output
出力最大
::tensorflow::Output output_max
出力最小値
::tensorflow::Output output_min
公的機能
QuantizeV2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T )
QuantizeV2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs )
パブリック静的関数
軸
Attrs Axis( int64 x )
最小範囲を確保する
Attrs EnsureMinimumRange( float x )
モード
Attrs Mode( StringPiece x )
狭い範囲
Attrs NarrowRange( bool x )
ラウンドモード
Attrs RoundMode( StringPiece x )