MaxPool

バージョン名: MaxPool-1

カテゴリー: プーリング

簡単な説明: 入力に対して最大プーリング操作を実行します。

詳細な説明: 入力形状は 3D、4D、または 5D のいずれかです。Max Pooling 操作は、3 次元から最後の次元までの入力形状に対して実行されます。パディングが使用される場合、プーリング計算中の値は -inf になります。最大プーリング操作には、特徴マップの各チャネル上でフィルターをスライドさせ、フィルターでカバーされる領域内の最大値を選択するダウンサンプリングが含まれます。畳み込みネットワークの最大プーリングに関する記事

属性: Pooling 属性は、レイヤーノードの子である data ノードで指定されます。

  • strides

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

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

    • タイプ: int[]

    • 必須: はい

  • pads_begin

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

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

    • タイプ: int[]

    • 必須: はい

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

  • pads_end

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

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

    • タイプ: int[]

    • 必須: はい

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

  • kernel

    • 説明: kernel は各フィルターのサイズです。例えば、カーネルが (2, 3) に等しい場合は、各フィルターの高さが 2、幅が 3 であることを意味します。

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

    • タイプ: int[]

    • 必須: はい

  • rounding_type

    • 説明: rounding_type は、出力形状の計算に使用される丸めのタイプです。

    • 値の範囲:

      • ceil

      • floor

    • タイプ: 文字列

    • デフォルト値 : floor

    • 必須: いいえ

  • auto_pad

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

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

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

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

    • タイプ: 文字列

    • デフォルト値: explicit

    • 必須: いいえ

    • 注: auto_pad が explicit と等しくない場合、pads_beginpads_end 属性は無視されます。

入力:

  • 1: T タイプの 3D、4D、または 5D 入力テンソル。必須。

出力:

  • 1: 入力形状は、[N, C, H][N, C, H, W] または [N, C, H, W, D] のいずれかです。この場合、対応する出力形状は [N, C, H_out][N, C, H_out, W_out] または [N, C, H_out, W_out, D_out] になります。出力テンソルのデータタイプは入力テンソルと同じです。

タイプ:

  • T: 浮動小数点タイプまたは整数タイプ。

数学定式化

auto_padrounding_type に基づいた出力形状の計算:

  • auto_pad = explicit および rounding_type = floor

    H_out = floor(H + pads_begin[0] + pads_end[0] - kernel[0] / strides[0]) + 1 W_out = floor(W + pads_begin[1] + pads_end[1] - kernel[1] / strides[1]) + 1 D_out = floor(D + pads_begin[2] + pads_end[2] - kernel[2] / strides[2]) + 1

  • auto_pad = valid および rounding_type = floor

    H_out = floor(H - kernel[0] / strides[0]) + 1 W_out = floor(W - kernel[1] / strides[1]) + 1 D_out = floor(D - kernel[2] / strides[2]) + 1

  • auto_pad = same_upper/same_lower および rounding_type = floor

    H_out = H W_out = W D_out = D

  • auto_pad = explicit および rounding_type = ceil

    H_out = ceil(H + pads_begin[0] + pads_end[0] - kernel[0] / strides[0]) + 1 W_out = ceil(W + pads_begin[1] + pads_end[1] - kernel[1] / strides[1]) + 1 D_out = ceil(D + pads_begin[2] + pads_end[2] - kernel[2] / strides[2]) + 1

  • auto_pad = valid および rounding_type = ceil

    H_out = ceil(H - kernel[0] / strides[0]) + 1 W_out = ceil(W - kernel[1] / strides[1]) + 1 D_out = ceil(D - kernel[2] / strides[2]) + 1

  • auto_pad = same_upper/same_lower および rounding_type = ceil

    H_out = H W_out = W D_out = D

H + pads_begin[i] + pads_end[i] - kernel[i]strides[i] で均等に分割されていない場合、結果は rounding_type 属性に従って丸められます。

  1. 例 1 は、MaxPool が 2D カーネルと auto_pad = explicit を使用して 4D 入力でどのように動作するかを示しています。

    input = [[[[-1, 2, 3],
               [4, 5, -6],
               [-7, 8, 9]]]]
    strides = [1, 1]
    pads_begin = [1, 1]
    pads_end = [1, 1]
    kernel = [2, 2]
    rounding_type = "floor"
    auto_pad = "explicit"
    output = [[[[-1, 2, 3, 3],
                [4, 5, 5, -6],
                [4, 8, 9, 9],
                [-7, 8, 9, 9]]]]
    
  2. 例 2 は、MaxPool が 1D カーネルと auto_pad = valid を使用して 3D 入力でどのように動作するかを示しています。

    input = [[[-1, 2, 3, 5, -7, 9, 1]]]
    strides = [1]
    kernel = [3]
    rounding_type = "floor"
    auto_pad = "valid"
    output = [[[3, 5, 5, 9, 9]]]
    
  3. 例 3 は、MaxPool が 2D カーネルと auto_pad = same_lower を使用して 4D 入力でどのように動作するかを示しています。

    input = [[[[-1, 2, 3],
             [4, 5, -6],
             [-7, 8, 9]]]]
    strides = [1, 1]
    kernel = [2, 2]
    rounding_type = "floor"
    auto_pad = "same_lower"
    output = [[[[-1, 2, 3],
                [4, 5, 5]
                [4, 8, 9]]]]
    
  4. 例 4 は、MaxPool が 2D カーネルと auto_pad = same_upper を使用して 4D 入力でどのように動作するかを示しています。

    input = [[[[-1, 2, 3],
               [4, 5, -6],
               [-7, 8, 9]],
              [[2, -1, 5],
               [6, -7, 1],
               [8, 2, -3]]]]
    strides = [1, 1]
    kernel = [2, 2]
    rounding_type = "floor"
    auto_pad = "same_upper"
    output = [[[[5, 5, 3],
                [8, 9, 9]
                [8, 9, 9]],
               [[6, 5, 5],
                [8, 2, 1],
                [8, 2, -3]]]]
    
  5. 例 5 は、MaxPool が 2D カーネル、auto_pad = valid、および rounding_type = ceil を使用して 4D 入力でどのように動作するかを示しています。

    input = [[[[-1, 2, 3],
               [4, 5, -6],
               [-7, 8, 9]]]]
    strides = [2, 2]
    kernel = [2, 2]
    rounding_type = "ceil"
    auto_pad = "valid"
    output = [[[[5, 3],
                [8, 9]]]]
    

例:

<layer ... type="MaxPool" ... >
    <data auto_pad="same_upper" kernel="2,2" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>3</dim>
            <dim>32</dim>
            <dim>32</dim>
        </port>
    </input>
    <output>
        <port id="1">
            <dim>1</dim>
            <dim>3</dim>
            <dim>32</dim>
            <dim>32</dim>
        </port>
    </output>
</layer>

<layer ... type="MaxPool" ... >
    <data auto_pad="explicit" kernel="2,2" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>3</dim>
            <dim>32</dim>
            <dim>32</dim>
        </port>
    </input>
    <output>
        <port id="1">
            <dim>1</dim>
            <dim>3</dim>
            <dim>17</dim>
            <dim>17</dim>
        </port>
    </output>
</layer>

<layer ... type="MaxPool" ... >
    <data auto_pad="valid" kernel="2,2" pads_begin="1,1" pads_end="1,1" strides="2,2"/>
    <input>
        <port id="0">
            <dim>1</dim>
            <dim>3</dim>
            <dim>32</dim>
            <dim>32</dim>
        </port>
    </input>
    <output>
        <port id="1">
            <dim>1</dim>
            <dim>3</dim>
            <dim>16</dim>
            <dim>16</dim>
        </port>
    </output>
</layer>