Quantize

パブリック最終クラスQuantize

float 型の '入力' テンソルを 'T' 型の '出力' テンソルに量子化します。

[min_range, max_range] は、「入力」データの範囲を指定するスカラー浮動小数点数です。 「mode」属性は、float 値を量子化された同等の値に変換するためにどの計算が使用されるかを正確に制御します。 「round_mode」属性は、float 値を量子化された値に丸めるときにどの丸めタイブレーク アルゴリズムを使用するかを制御します。

'MIN_COMBINED' モードでは、テンソルの各値は次の処理を受けます:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
 if T == qint8: out[i] -= (range(T) + 1) / 2.0
 
here `range(T) = numeric_limits ::max() - numeric_limits ::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]) の場合、この演算では、値の範囲が qint8 の範囲と一致するように、キャスト前にさらに各値を 128 減算します。

モードが '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 を使用すると、量子化と逆量子化を繰り返すと、小さなバイアスが発生し、誤差がますます大きくなります。

SCALEモードの例

「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` を調整します。 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 (ブール値) 属性

true の場合、最小量子化値は使用されません。つまり、量子化された出力である int8 の場合、-128..127 の全範囲ではなく、-127..127 の範囲に制限されます。これは、特定の推論バックエンドとの互換性のために提供されています。 (SCALED モードにのみ適用されます)

軸 (int) 属性

オプションの `axis` 属性は、量子化範囲がその次元に沿ったテンソルのスライスごとに個別に計算され適用されるように、入力テンソルの次元インデックスを指定できます。これはチャネルごとの量子化に役立ちます。

axis を指定した場合、min_range と max_range

`axis`=None の場合、テンソルごとの量子化が通常どおり実行されます。

ensure_minimum_range (float) 属性

最小量子化範囲が少なくともこの値であることを保証します。この従来のデフォルト値は 0.01 ですが、新たに使用する場合は 0 に設定することを強くお勧めします。

ネストされたクラス

クラスクオンタイズオプションQuantizeのオプションの属性

定数

OP_NAME TensorFlow コア エンジンによって認識される、この演算の名前

パブリックメソッド

静的Quantize.Options
(長軸)
static <T extends TType >量子化<T>
create (スコープscope, Operand < TFloat32 > input, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, Options... options)
新しい量子化操作をラップするクラスを作成するためのファクトリ メソッド。
静的Quantize.Options
ensureMinimumRange (浮動小数点 ensureMinimumRange)
静的Quantize.Options
モード(文字列モード)
静的Quantize.Options
ナローレンジ(ブール値のナローレンジ)
出力<T>
出力()
float 入力から生成された量子化データ。
出力< TFloat32 >
出力最大()
最終的な量子化範囲の最大値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。
出力< TFloat32 >
出力最小値()
最終的な量子化範囲の最小値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。
静的Quantize.Options
RoundMode (文字列roundMode)

継承されたメソッド

定数

パブリック静的最終文字列OP_NAME

TensorFlow コア エンジンによって認識される、この演算の名前

定数値: 「QuantizeV2」

パブリックメソッド

public static Quantize.Options(長軸)

public static Quantize <T> create (スコープscope, Operand < TFloat32 > input, Operand < TFloat32 > minRange, Operand < TFloat32 > maxRange, Class<T> T, Options... options)

新しい量子化操作をラップするクラスを作成するためのファクトリ メソッド。

パラメーター
範囲現在のスコープ
最小範囲量子化範囲の最小値。この値は、他のパラメータに応じて操作によって調整される場合があります。調整した値は「output_min」に書き込まれます。 `axis` 属性が指定されている場合、これは、サイズが入力および出力テンソルの `axis` 次元と一致する 1 次元テンソルでなければなりません。
最大範囲量子化範囲の最大値。この値は、他のパラメータに応じて操作によって調整される場合があります。調整した値は「output_max」に書き込まれます。 `axis` 属性が指定されている場合、これは、サイズが入力および出力テンソルの `axis` 次元と一致する 1 次元テンソルでなければなりません。
オプションオプションの属性値を持ちます
戻り値
  • クオンタイズの新しいインスタンス

public static Quantize.Options ensureMinimumRange (Float ensureMinimumRange)

public static Quantize.Optionsモード(文字列モード)

public static Quantize.OptionsNarrowRange (ブール値のnarrowRange)

public出力<T>出力()

float 入力から生成された量子化データ。

public Output < TFloat32 > OutputMax ()

最終的な量子化範囲の最大値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。 `axis` 属性が指定されている場合、これは、サイズが入力および出力テンソルの `axis` 次元と一致する 1 次元テンソルになります。

public Output < TFloat32 > OutputMin ()

最終的な量子化範囲の最小値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。 `axis` 属性が指定されている場合、これは、サイズが入力および出力テンソルの `axis` 次元と一致する 1 次元テンソルになります。

public static Quantize.OptionsroundMode (文字列roundMode)