Convolution

バージョン名: Convolution-1

カテゴリー: 畳み込み

簡単な説明: 入力テンソルとカーネルテンソルの 1D、2D、または 3D 畳み込み (正確には相互相関) を計算します。

詳細な説明: 畳み込みの基本構成要素は、入力パッチとカーネルのドット積です。全体の操作は、複数の入力パッチとカーネルに対する複数の計算で構成されます。より詳しい説明は、畳み込みニューラル・ネットワーク畳み込み操作を参照してください。

畳み込みレイヤーの場合、各次元の出力特徴の数は次の式で計算されます。

\[n_{out} = \left ( \frac{n_{in} + 2p - k}{s} \right ) + 1\]

各レイヤーの受容野は次の式で計算されます。

  • 出力特徴マップにジャンプします。

    \[j_{out} = j_{in} \cdot s\]
  • 出力特徴の受容野のサイズ:

    \[r_{out} = r_{in} + ( k - 1 ) \cdot j_{in}\]
  • 最初の出力特徴の受容野の中心位置:

    \[start_{out} = start_{in} + ( \frac{k - 1}{2} - p ) \cdot j_{in}\]
  • 出力は次の式で計算されます。

    \[out = \sum_{i = 0}^{n}w_{i}x_{i} + b\]

属性:

  • strides

    • 説明: strides は、3D 畳み込みの場合は (z, y, x) 軸上、2D 畳み込みの場合は (y, x) 軸上で特徴マップ上のフィルターをスライドさせる距離 (ピクセル単位) です。例えば、strides4,2,1 に等しい場合は、フィルターを奥行き次元で 4 ピクセル、高さ次元で 2 ピクセル、幅次元で 1 ピクセルずつスライドさせることを意味します。

    • 値の範囲: 0 から始まる整数値

    • タイプ: int[]

    • 必須: はい

  • pads_begin

    • 説明: pads_begin は、各軸に沿って先頭に追加するピクセル数です。例えば、pads_begin1,2 に等しい場合は、入力の上部に 1 ピクセル、入力の左側に 2 ピクセルを追加することを意味します。

    • 値の範囲: 0 から始まる整数値

    • タイプ: int[]

    • 必須: はい

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

  • pads_end

    • 説明: pads_end は、各軸に沿って終了点に追加するピクセル数です。例えば、pads_end1,2 に等しい場合は、入力の下部に 1 ピクセル、入力の右側に 2 ピクセルを追加することを意味します。

    • 値の範囲: 0 から始まる整数値

    • タイプ: int[]

    • 必須: はい

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

  • dilations

    • 説明: dilations は、フィルター内の要素 (重み) 間の幅と高さの距離を示します。例えば、dilation1,1 に等しいということは、フィルター内のすべての要素が隣接していることを意味するため、通常の畳み込みと同じになります。dilation2,2 に等しい場合は、フィルター内のすべての要素が入力行列内の隣接する要素ではなく、距離 1 で隣接する要素と照合されることを意味します。

    • 値の範囲: 0 から始まる整数値

    • タイプ: int[]

    • 必須: はい

  • auto_pad

    • 説明: auto_pad パディングの計算方法。
      設定可能な値:

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

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

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

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

    • タイプ: string

    • デフォルト値: explicit

    • 必須: いいえ

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

入力:

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

  • 2: タイプ T およびランク 3、4、または 5 のカーネルテンソル。レイアウトは、[C_OUT, C_IN, Z, Y, X] (出力チャネル数、入力チャネル数、空間軸 Z、Y、X) です。必須。

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

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

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

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

出力:

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

タイプ:

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

例:

1D 畳み込み

<layer type="Convolution" ...>
    <data dilations="1" pads_begin="0" pads_end="0" strides="2" auto_pad="valid"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>5</dim>
            <dim>128</dim>
        </port>
        <port id="1">
            <dim>16</dim>
            <dim>5</dim>
            <dim>4</dim>
        </port>
    </input>
    <output>
        <port id="2" precision="FP32">
            <dim>1</dim>
            <dim>16</dim>
            <dim>63</dim>
        </port>
    </output>
</layer>

2D 畳み込み

<layer type="Convolution" ...>
    <data dilations="1,1" pads_begin="2,2" pads_end="2,2" strides="1,1" auto_pad="explicit"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>3</dim>
            <dim>224</dim>
            <dim>224</dim>
        </port>
        <port id="1">
            <dim>64</dim>
            <dim>3</dim>
            <dim>5</dim>
            <dim>5</dim>
        </port>
    </input>
    <output>
        <port id="2" precision="FP32">
            <dim>1</dim>
            <dim>64</dim>
            <dim>224</dim>
            <dim>224</dim>
        </port>
    </output>
</layer>

3D 畳み込み

<layer type="Convolution" ...>
    <data dilations="2,2,2" pads_begin="0,0,0" pads_end="0,0,0" strides="3,3,3" auto_pad="explicit"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>7</dim>
            <dim>320</dim>
            <dim>320</dim>
            <dim>320</dim>
        </port>
        <port id="1">
            <dim>32</dim>
            <dim>7</dim>
            <dim>3</dim>
            <dim>3</dim>
            <dim>3</dim>
        </port>
    </input>
    <output>
        <port id="2" precision="FP32">
            <dim>1</dim>
            <dim>32</dim>
            <dim>106</dim>
            <dim>106</dim>
            <dim>106</dim>
        </port>
    </output>
</layer>