テンソルフロー::作戦::量子化と逆量子化V2

#include <array_ops.h>

テンソルを量子化してから逆量子化します。

まとめ

この演算は、量子化されたフォワードパスによる精度損失を次のようにシミュレートします。

  1. テンソルを固定小数点数に量子化します。これは、推論で使用されるときにターゲットの量子化方法と一致する必要があります。
  2. 次の操作 (おそらく matmul) のためにそれを逆量子化して浮動小数点数に戻します。

量子化にはさまざまな方法があります。このバージョンではスケーリングのみが使用されるため、0.0 は 0 にマップされます。

量子化された出力タイプで指定された 'num_bits' から、表現可能な最小および最大の量子化値が決定されます。

例えば

  • [-128, 127] 符号付き、num_bits = 8、または
  • [0, 255] 符号なし、num_bits = 8。

range_given == False の場合、初期の input_min、input_max は入力テンソルの最小値と最大値として自動的に決定されます。それ以外の場合は、input_min、input_max の指定された値が使用されます。

注: input_min、input_max が指定されている場合、それらはテンソルの実際の最小値と最大値に等しい必要はありません。たとえば、場合によっては、入力分布の確率の低い極値がクリップされるようにこれらの値を指定すると有益な場合があります。

この演算は、初期の [input_min, input_max] 範囲を表現可能な量子化範囲内にある範囲にマップする最大のscale_factor を決定します。

input_min と input_max の一方からスケールを決定し、もう一方を更新して表現可能な範囲を最大化します。

例えば

  • 出力が符号付きの場合、num_bits = 8、[input_min, input_max] = [-10.0, 5.0]: -128 / -10.0 = 12.8 のscale_factor が使用されます。この場合、input_max は 127 / 12.8 = に更新されます。 9.921875
  • 出力が符号付きの場合、num_bits = 8、[input_min, input_max] = [-10.0, 10.0]: 127 / 10.0 = 12.7 のscale_factor が使用されます。この場合、input_min は 128.0 / 12.7 = -10.07874 に更新されます。
  • 出力が符号なしの場合、input_min は強制的に 0 に設定され、指定された input_max のみが使用されます。

scale_factor を決定し、入力範囲を更新した後、「入力」テンソルの各値に以下を適用します。

出力 = Round(クランプ(値, 入力最小, 入力最大) * スケールファクター) / スケールファクター。

上記のround関数は、指定されたround_modeに基づいて値を丸めます。

引数:

  • スコープ:スコープオブジェクト
  • input: 量子化してから逆量子化するテンソル
  • input_min: range_given == Trueの場合、これは表現する必要がある最小入力値を指定します。それ以外の場合、 inputテンソルの最小値から決定されます。
  • input_max: range_given == Trueの場合、これは表現する必要がある最大入力値を指定します。それ以外の場合、 inputテンソルの最大値から決定されます。

オプションの属性 ( Attrsを参照):

  • signed_input: 量子化が符号付きであるか符号なしであるか。 (実際には、このパラメータはsigned_outputという名前にする必要がありました)
  • num_bits: 量子化のビット幅。
  • range_given: 範囲が指定されているか、 inputテンソルから決定される必要があるか。
  • round_mode: 「round_mode」属性は、float 値を量子化された値に丸めるときにどの丸めタイブレーク アルゴリズムを使用するかを制御します。現在、次の丸めモードがサポートされています。
  • HALF_TO_EVEN: これはデフォルトのround_modeです。
  • HALF_UP: 正の方向に丸めます。このモードでは、7.5 は 8 に切り上げられ、-7.5 は -7 に切り上げられます。
  • Narrow_range: True の場合、量子化された最小値の絶対値は、1 大きい値ではなく、量子化された最大値と同じになります。つまり、8 ビット量子化の場合、最小値は -128 ではなく -127 になります。
  • axis: 指定した場合、この軸はチャネル軸またはスライス軸として扱われ、この軸に沿った各チャネルまたはスライスに個別の量子化範囲が使用されます。

戻り値:

  • Output : 出力テンソル。

コンストラクターとデストラクター

QuantizeAndDequantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input input_min, :: tensorflow::Input input_max)
QuantizeAndDequantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input input_min, :: tensorflow::Input input_max, const QuantizeAndDequantizeV2::Attrs & attrs)

パブリック属性

operation
output

公共機能

node () const
::tensorflow::Node *
operator::tensorflow::Input () const
operator::tensorflow::Output () const

パブリック静的関数

Axis (int64 x)
NarrowRange (bool x)
NumBits (int64 x)
RangeGiven (bool x)
RoundMode (StringPiece x)
SignedInput (bool x)

構造体

tensorflow:: ops:: QuantizeAndDequantizeV2:: Attrs

QuantizeAndDequantizeV2のオプションの属性セッター。

パブリック属性

手術

Operation operation

出力

::tensorflow::Output output

公共機能

量子化と逆量子化V2

 QuantizeAndDequantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input input_min,
  ::tensorflow::Input input_max
)

量子化と逆量子化V2

 QuantizeAndDequantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input input_min,
  ::tensorflow::Input input_max,
  const QuantizeAndDequantizeV2::Attrs & attrs
)

ノード

::tensorflow::Node * node() const 

演算子::tensorflow::入力

 operator::tensorflow::Input() const 

演算子::tensorflow::出力

 operator::tensorflow::Output() const 

パブリック静的関数

Attrs Axis(
  int64 x
)

狭い範囲

Attrs NarrowRange(
  bool x
)

ビット数

Attrs NumBits(
  int64 x
)

範囲指定

Attrs RangeGiven(
  bool x
)

ラウンドモード

Attrs RoundMode(
  StringPiece x
)

署名付き入力

Attrs SignedInput(
  bool x
)