ConvolutionBackpropData

バージョン名: ConvolutionBackpropData-1

カテゴリー: 畳み込み

簡単な説明: 入力テンソルとカーネルテンソルに関して 1D、2D、または 3D ConvolutionBackpropData 操作を計算します。これは、転置畳み込みとも呼ばれます。

詳細説明:

ConvolutionBackpropData は、入力テンソル、重み付けテンソル、出力形状を取得し、指定された形状の出力テンソルを計算します。出力の形状は、入力 1D 整数テンソルとして明示的に指定することも、他の属性によって暗黙的に決定することもできます。出力形状が明示的な入力として指定される場合、出力の形状は指定されたサイズに一致し、必要なパディング量が計算されます。詳しい説明は、転置畳み込みを参照してください。

ConvolutionBackpropData は、通常の Convolution 操作と同じ属性セットを受け入れ、さらに output_padding 属性も受け入れますが、それらは “逆方向” に解釈されるため、ConvolutionBackpropData の出力には適用されますが、入力には適用されません。それぞれの畳み込み属性の詳細な説明については、通常の畳み込み操作を参照してください。

出力形状が入力テンソル output_shape として指定される場合、空間次元のみが指定されます。バッチまたはチャネルの次元を空間次元と一緒に渡す必要はありません。output_shape が省略された場合は、pads_beginpads_end または auto_pad を使用して、次の方法で入力空間形状 [I_z, I_y, I_x] によって出力空間形状 [O_z, O_y, O_x] を決定します。

if auto_pads != None:
    pads_begin[i] = 0
    pads_end[i] = 0

Y_i = stride[i] * (X_i - 1) + ((K_i - 1) * dilations[i] + 1) - pads_begin[i] - pads_end[i] + output_padding[i]

ここで、K_i は空間軸 i に沿ったフィルターカーネルの次元です。

output_shape が指定されている場合、pads_beginpads_end は無視され、auto_pad はテンソルの周囲にパディング量を分散する方法を定義します。この場合、入力テンソルと出力テンソルを正しく位置合わせするため、次の式に基づいてパディング量が決定されます。

total_padding[i] = stride[i] * (X_i - 1) + ((K_i - 1) * dilations[i] + 1) - output_shape[i] + output_padding[i]
if auto_pads != SAME_UPPER:
    pads_begin[i] = total_padding[i] // 2
    pads_end[i] = total_padding[i] - pads_begin[i]
else:
    pads_end[i] = total_padding[i] // 2
    pads_begin[i] = total_padding[i] - pads_end[i]

属性:

  • strides

    • 説明: strides は通常の畳み込みの strides と同じ定義を持ちますが、出力テンソルに対して逆方向に適用されます。

    • 値の範囲: 正の整数

    • タイプ: int[]

    • 必須: はい

  • pads_begin

    • 説明: pads_begin は通常の畳み込みの pads_begin と同じ定義を持ちますが、出力テンソルに対して逆方向に適用されます。省略することもできますが、その場合パッドは自動的に計算されます。

    • 値の範囲: 負ではない整数

    • タイプ: int[]

    • 必須: はい

    • 注: auto_pad 属性が指定されている場合、この属性は無視されます。

  • pads_end

    • 説明: pads_end は通常の畳み込みの pads_end と同じ定義を持ちますが、出力テンソルに対して逆方向に適用されます。省略することもできますが、その場合パッドは自動的に計算されます。

    • 値の範囲: 負ではない整数

    • タイプ: int[]

    • 必須: はい

    • 注: auto_pad 属性が指定されている場合、この属性は無視されます。

  • dilations

    • 説明: dilations は通常の畳み込みの dilations と同じ定義を持ちますが、出力テンソルに対して逆方向に適用されます。

    • 値の範囲: 正の整数

    • タイプ: int[]

    • 必須: はい

  • auto_pad

    • 説明: auto_padは通常の畳み込みの auto_pad と同じ定義を持ちますが、出力テンソルに対して逆方向に適用されます。

      • explicit: pads_beginpads_end からの明示的なパディング値を使用します。

      • same_upper - 入力は出力サイズに一致するようにパディングされます。奇数のパディング値の場合、最後にパディングが追加されます。

      • same_lower - 入力は出力サイズに一致するようにパディングされます。パディング値が奇数の場合、先頭にパディングが追加されます。

      • valid - パディングを使用しません。

    • タイプ: string

    • デフォルト値: なし

    • 必須: いいえ

    • 注: auto_pad が指定されている場合、pads_beginpads_end 属性は無視されます。

  • output_padding

    • 説明: output_padding は、output テンソルの各空間軸ごとにパディングを追加します。出力内のより多くの要素のロックが解除され、計算できるようになります。要素は、空間次元のより高い座標インデックスに追加されます。output_padding リストの要素の数は、data および output テンソルの空間次元の数と一致します。

    • 値の範囲: 負ではない整数値

    • タイプ: int[]

    • デフォルト値: すべてゼロ

    • 必須: いいえ

入力:

  • 1: タイプ T1 およびランク 3、4 または 5 の入力テンソル。レイアウトは、[N, C_INPUT, Z, Y, X] (バッチ数、入力チャネル数、空間軸 Z、Y、X) です。必須。

  • 2: タイプ T1 およびランク 3、4、または 5 の畳み込みカーネルテンソル。レイアウトは、[C_INPUT, C_OUTPUT, Z, Y, X] (入力チャネル数、出力チャネル数、空間軸 Z、Y、X) です。カーネルの空間サイズはこの入力の形状で決定され、属性によって指定されるものではありません。必須。

  • 3: output_shape は、出力の空間形状を指定する T2 タイプの 1D テンソルです。指定されている場合、パディング量は、説明の式に従って入力空間形状と出力空間形状の関係から推定されます。指定されない場合、出力形状は、pads_beginpads_end、または auto_pad に従って計算されます。オプション。

  • 注: 畳み込みのタイプ (1D、2D、または 3D) は入力テンソルのランクで決定され、属性によって指定されません。

    • 1D 畳み込み (入力テンソルのランク 3) は、空間軸 X が 1 つだけであることを意味します

    • 2D 畳み込み (入力テンソルのランク 4) は、2 つの空間軸 Y、X があることを意味します

    • 3D 畳み込み (入力テンソルのランク 5) は、3 つの空間軸 Z、Y、X があることを意味します

出力:

  • 1: タイプ T1 およびランク 3、4、または 5 の出力テンソル。レイアウトは、[N, C_OUTPUT, Z, Y, X] (バッチの数、カーネル出力チャネルの数、空間軸 Z、Y、X) です。

タイプ:

  • T1: 任意の数値タイプ。

  • T2: 任意の整数タイプ。

例:

Example 1: 2D ConvolutionBackpropData

<layer id="5" name="upsampling_node" type="ConvolutionBackpropData">
    <data dilations="1,1" pads_begin="1,1" pads_end="1,1" strides="2,2" output_padding="0,0" auto_pad="explicit"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>20</dim>
            <dim>224</dim>
            <dim>224</dim>
        </port>
        <port id="1">
            <dim>20</dim>
            <dim>10</dim>
            <dim>3</dim>
            <dim>3</dim>
        </port>
    </input>
    <output>
        <port id="0" precision="FP32">
            <dim>1</dim>
            <dim>10</dim>
            <dim>447</dim>
            <dim>447</dim>
        </port>
    </output>
</layer>

Example 2: output_padding による 2D ConvolutionBackpropData

<layer id="5" name="upsampling_node" type="ConvolutionBackpropData">
    <data dilations="1,1" pads_begin="0,0" pads_end="0,0" strides="3,3" output_padding="2,2" auto_pad="explicit"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>20</dim>
            <dim>2</dim>
            <dim>2</dim>
        </port>
        <port id="1">
            <dim>20</dim>
            <dim>10</dim>
            <dim>3</dim>
            <dim>3</dim>
        </port>
    </input>
    <output>
        <port id="0" precision="FP32">
            <dim>1</dim>
            <dim>10</dim>
            <dim>8</dim>
            <dim>8</dim>
        </port>
    </output>
</layer>

Example 3: output_shape 入力による 2D ConvolutionBackpropData

<layer id="5" name="upsampling_node" type="ConvolutionBackpropData">
    <data dilations="1,1" pads_begin="1,1" pads_end="1,1" strides="1,1" output_padding="0,0" auto_pad="valid"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>20</dim>
            <dim>224</dim>
            <dim>224</dim>
        </port>
        <port id="1">
            <dim>20</dim>
            <dim>10</dim>
            <dim>3</dim>
            <dim>3</dim>
        </port>
        <port id="2">
            <dim>2</dim> <!-- output_shape value is: [450, 450]-->
        </port>
    </input>
    <output>
        <port id="0" precision="FP32">
            <dim>1</dim>
            <dim>10</dim>
            <dim>450</dim>
            <dim>450</dim>
        </port>
    </output>
</layer>