FakeQuantize

バージョン名: FakeQuantize-1

カテゴリー: 量子化

簡単な説明: FakeQuantize は、浮動小数点入力値を浮動小数点値の離散セットに要素ごとに線形量子化します。

詳細な説明: 入力範囲と出力範囲、および量子化レベルの数は、専用の入力と属性によって指定されます。入力テンソルの要素ごと、または要素のグループ (チャネル) ごとに異なる制限がある可能性があります。それは、1 つの制限がすべての要素に適用されます。それは、制限を指定する入力の形状と、入力テンソルに適用される通常のブロードキャスト・ルールに依存します。オペレーターの出力は、入力テンソルと同じタイプの浮動小数点数です。一般に、各要素の量子化を指定する値は、input_lowinput_highoutput_lowoutput_high の 4 つです。input_low 属性と input_high 属性では、量子化の入力範囲を指定します。範囲外にあるすべての入力値は、実際の量子化の前に範囲にクリップされます。output_lowoutput_high では、出力の最小量子化値と最大量子化値を指定します。

FakeQuantizeFake は、出力テンソルが整数タイプではなく、入力テンソルと同じ浮動小数点タイプであることを意味します。

出力の各要素は、次の式の結果として定義されます。

if x <= min(input_low, input_high):
    output = output_low
elif x > max(input_low, input_high):
    output = output_high
else:
    # input_low < x <= input_high
    output = round((x - input_low) / (input_high - input_low) * (levels-1)) / (levels-1) * (output_high - output_low) + output_low

属性:

  • levels

    • 説明: levels は量子化レベルの数です (例: 2 は 2 値化の場合、255/256 は int8 量子化の場合です)

    • 値の範囲: 2 以上の整数

    • タイプ: int

    • 必須: はい

  • auto_broadcast

    • 説明: 入力テンソルの自動ブロードキャストに使用されるルールを指定します。

    • 値の範囲:

      • none - 自動ブロードキャストは許可されません。すべての入力形状が一致する必要があります
      • numpy - numpy ブロードキャスト・ルール。説明は [要素ごとの操作のブロードキャスト・ルール](../broadcast_rules.md) で参照できます
      • pdpd - PaddlePaddle スタイルの暗黙的ブロードキャストの説明は、[要素ごとの操作のブロードキャスト・ルール](../broadcast_rules.md) で参照できます
    • タイプ: 文字列

    • デフォルト値: “numpy”

    • 必須: いいえ

入力:

  • 1: X - タイプ T_F の任意の形状のテンソル。必須。

  • 2: input_low - 入力値の最小制限を持つ T_F タイプのテンソル。形状は X の形状にブロードキャスト可能である必要があります。必須。

  • 3: input_high - 入力値の最大制限を持つ T_F タイプのテンソル。2 値化の場合は input_low と同じにすることができます。形状は X の形状にブロードキャスト可能である必要があります。 必須。

  • 4: output_low - 最小量子化値を持つ T_F タイプのテンソル。形状は X の形状にブロードキャスト可能である必要があります。必須。

  • 5: output_high - 最大量子化値を持つ T_F タイプのテンソル。形状は X にブロードキャスト可能である必要があります。必須。

出力:

  • 1: 1 番目の入力テンソル X と一致する形状とタイプを持つ、タイプ T_F の出力テンソル。

タイプ:

  • T_F: サポートされている浮動小数点タイプ。

例:

<layer  type="FakeQuantize">
    <data levels="2"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>64</dim>
            <dim>56</dim>
            <dim>56</dim>
        </port>
        <port id="1">
            <dim>1</dim>
            <dim>64</dim>
            <dim>1</dim>
            <dim>1</dim>
        </port>
        <port id="2">
            <dim>1</dim>
            <dim>64</dim>
            <dim>1</dim>
            <dim>1</dim>
        </port>
        <port id="3">
            <dim>1</dim>
            <dim>1</dim>
            <dim>1</dim>
            <dim>1</dim>
        </port>
        <port id="4">
            <dim>1</dim>
            <dim>1</dim>
            <dim>1</dim>
            <dim>1</dim>
        </port>
    </input>
    <output>
        <port id="5">
            <dim>1</dim>
            <dim>64</dim>
            <dim>56</dim>
            <dim>56</dim>
        </port>
    </output>
</layer>