テンソルフロー::作戦::クオンタイズV2

#include <array_ops.h>

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

ここでrange(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min() 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::min()
quantized = max(quantized, numeric_limits::min())
quantized = min(quantized, numeric_limits::max())

これと MIN_COMBINED の最大の違いは、最小範囲が丸められた値から減算される前に、最初に丸められることです。 MIN_COMBINED を使用すると、量子化と逆量子化を繰り返すと、小さなバイアスが発生し、誤差がますます大きくなります。

SCALEモードの例

SCALEDモードは、 QuantizeAndDequantize{V2|V3}で使用される量子化アプローチと一致します。

モードがSCALEDの場合、量子化は各入力値に scaling_factor を乗算することによって実行されます。 scaling_factor は、 min_rangeからmax_rangeまでの範囲が T 型の値内で表現できるように、 min_rangemax_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_rangemax_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 に設定することを強くお勧めします。

引数:

  • スコープ:スコープオブジェクト
  • min_range: 量子化範囲の最小値。この値は、他のパラメータに応じて操作によって調整される場合があります。調整された値は、 output_minに書き込まれます。 axis属性が指定されている場合、これは、サイズが入力テンソルと出力テンソルのaxis次元と一致する 1 次元テンソルである必要があります。
  • max_range: 量子化範囲の最大値。この値は、他のパラメータに応じて操作によって調整される場合があります。調整された値は、 output_maxに書き込まれます。 axis属性が指定されている場合、これは、サイズが入力テンソルと出力テンソルのaxis次元と一致する 1 次元テンソルである必要があります。

戻り値:

  • Output出力: float 入力から生成された量子化データ。
  • Output Output_min: 最終的な量子化範囲の最小値。入力値をスケーリングして量子化値に丸める前にクリップするために使用されます。 axis属性が指定されている場合、これは、サイズが入力テンソルと出力テンソルのaxis次元と一致する 1 次元テンソルになります。
  • Output Output_max: 最終的な量子化範囲の最大値。入力値をスケーリングして量子化値に丸める前にクリップするために使用されます。 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

公共機能

クオンタイズV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

クオンタイズV2

 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
)