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
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())
SCALEモードの例
「SCALED」モードは、「QuantizeAndDequantize{V2|V3}」で使用される量子化アプローチと一致します。
モードが「SCALED」の場合、量子化は各入力値に scaling_factor を乗算することによって実行されます。 scaling_factor は、`min_range` から `max_range` までの範囲が T 型の値内で表現できるように、`min_range` と `max_range` からできるだけ大きくなるように決定されます。
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);
min_range = min_T / scale_factor;
max_range = max_T / scale_factor;
したがって、入力値を (-10, 9.921875) から (-128, 127) の範囲で量子化します。
入力テンソルは、値を `min_range` から `max_range` の範囲にクリップし、次のようにscale_factor を乗算することで量子化できるようになりました。
result = round(min(max_range, max(min_range, input)) * scale_factor)
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> | |
静的Quantize.Options | ensureMinimumRange (浮動小数点 ensureMinimumRange) |
静的Quantize.Options | モード(文字列モード) |
静的Quantize.Options | ナローレンジ(ブール値のナローレンジ) |
出力<T> | 出力() float 入力から生成された量子化データ。 |
出力< TFloat32 > | 出力最大() 最終的な量子化範囲の最大値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。 |
出力< TFloat32 > | 出力最小値() 最終的な量子化範囲の最小値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。 |
静的Quantize.Options | RoundMode (文字列roundMode) |
継承されたメソッド
定数
パブリック静的最終文字列OP_NAME
TensorFlow コア エンジンによって認識される、この演算の名前
パブリックメソッド
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 Output < TFloat32 > OutputMax ()
最終的な量子化範囲の最大値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。 `axis` 属性が指定されている場合、これは、サイズが入力および出力テンソルの `axis` 次元と一致する 1 次元テンソルになります。
public Output < TFloat32 > OutputMin ()
最終的な量子化範囲の最小値。入力値をスケーリングして量子化値に丸める前に、入力値をクリップするために使用されます。 `axis` 属性が指定されている場合、これは、サイズが入力および出力テンソルの `axis` 次元と一致する 1 次元テンソルになります。