tensorflow :: ops :: QuantizeV2

#include <array_ops.h>

タイプfloatの「入力」テンソルをタイプ「T」の「出力」テンソルに量子化します。

概要

[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 ::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])の場合、演算はキャスト前に各値を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モードの例

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

モードがSCALED場合、量子化は各入力値にscaling_factorを掛けることによって実行されます。 scaling_factorから決定されるmin_rangemax_rangeできるだけ大きくなるように範囲ようmin_rangemax_range型Tの値の範囲内で表現可能です

  

  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として返されます。これらの出力は、以降の計算の範囲として使用する必要があります。

ナローレンジ(ブール)属性

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

axis(int)属性

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

軸が指定されている場合、min_rangeおよびmax_range

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

sure_minimum_range(float)属性

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

引数:

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

output_max

::tensorflow::Output output_max

output_min

::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
)

RoundMode

Attrs RoundMode(
  StringPiece x
)