MaxPool

バージョン名: MaxPool-8

カテゴリー: プーリング

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

詳細な説明: 入力形状は 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[]

    • 必須: はい

  • dilations

    • 説明: dilations は、プール時に選択する次のピクセルのインデックスを指定します。存在しない場合、ダイレイションはデフォルトの 1 になり、隣接するピクセルが選択されます。値 2 は、1 つのピクセルがスキップされ、他のすべてのピクセルが考慮されます。ダイレイションでは、カーネルの空間軸ごとに 1 つの値を指定します。3D プーリングの場合は (z, y, x)、2D プーリングの場合は (y, x) です。

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

    • タイプ: int[]

    • デフォルト値: [1,1,...]

    • 必須: いいえ

  • 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 属性は無視されます。

  • index_element_type

    • 説明: インデックス付きの出力テンソルのタイプ

    • 値の範囲: “i64” または “i32”

    • タイプ: 文字列

    • デフォルト値: “i64”

    • 必須: いいえ

  • axis

    • 説明: 許可されるインデックス出力値の上限の計算に使用される入力形状の最初の次元のインジケーター。上限は、‘axis’ 属性で指定された次元から入力形状の終わりまでの次元の積です。

    • 値の範囲: 整数負の値は、次元を端から数えることを意味します。範囲は [-R, R - 1] です。ここで、R は入力テンソルのランクです。

    • タイプ: int

    • デフォルト値: 0

    • 必須: いいえ

入力:

  • 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] になります。出力テンソルのデータタイプは入力テンソルと同じです。

  • 2: プーリング操作によって選択された値のインデックスを持つ T_IND タイプの出力テンソル。この出力の形状は最初の出力と一致します。この出力のタイプは、index_element_type 属性で指定できます。値は、パディングを考慮せず 1D に平坦化されたテンソルのインデックスとして計算されます。
    5D 入力テンソルの例:

    • axis == 0 の場合、値は [0, N * C * H * W * D) の範囲になります。

    • axis == 2 の場合、値は [0, H * W * D) の範囲になります。

    この出力の値は、pads_value-infinity に設定されている場合にのみ正しく計算できます。

タイプ:

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

  • T_IND: int64 または int32

数学定式化

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

  • auto_pad = explicit および rounding_type = floor

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

  • auto_pad = explicit および rounding_type = ceil

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

  • auto_pad = valid

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

  • auto_pad = same_upper / same_lower

    H_out = H W_out = W D_out = D

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

  1. 例 1 は、2D カーネルと auto_pad = explicit を使用して MaxPool が 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"
    output0 = [[[[-1, 2, 3, 3],
                 [4, 5, 5, -6],
                 [4, 8, 9, 9],
                 [-7, 8, 9, 9]]]]
    output1 = [[[[0, 1, 2, 2],
                 [3, 4, 4, 5],
                 [3, 7, 8, 8],
                 [6, 7, 8, 8]]]]
    
  2. 例 2 は、1D カーネルと auto_pad = valid を使用して MaxPool が 3D 入力でどのように動作するかを示しています。

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

    input = [[[[-1, 2, 3],
             [4, 5, -6],
             [-7, 8, 9]]]]
    strides = [1, 1]
    kernel = [2, 2]
    rounding_type = "floor"
    auto_pad = "same_lower"
    output0 = [[[[-1, 2, 3],
                [4, 5, 5]
                [4, 8, 9]]]]
    output1 = [[[[0, 1, 2],
                [3, 4, 4]
                [3, 7, 8]]]]
    
  4. 例 4 は、2D カーネルと auto_pad = same_upper を使用して MaxPool が 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"
    output0 = [[[[5, 5, 3],
                 [8, 9, 9]
                 [8, 9, 9]],
                [[6, 5, 5],
                 [8, 2, 1],
                 [8, 2, -3]]]]
    output1 = [[[[4, 4, 2],
                 [7, 8, 8]
                 [7, 8, 8]],
                [[12, 11, 11],
                 [15, 16, 14],
                 [15, 16, 17]]]]
    
  5. 例 5 は、2D カーネル、auto_pad = validrounding_type = ceil を使用して MaxPool が 4D 入力でどのように動作するか示しています。

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

    input = [[[[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]]]]
    strides = [1, 1]
    kernel = [2, 2]
    dilations = [2, 2]
    rounding_type = "floor"
    auto_pad = "explicit"
    pads_begin = [1, 1]
    pads_end = [1, 1]
    output0 = [[[[5, 6, 5],
                 [8, 9, 8],
                 [5, 6, 5]]]]
    output1 = [[[[4, 5, 4],
                 [7, 8, 7],
                 [4, 5, 4]]]]
    
  7. 例 7 は、デフォルト以外の axis 値を持つ 2D カーネルを使用して、MaxPool が 4D 入力でどのように動作するか示しています。

    input = [[[[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]],
              [[10, 11, 12],
               [13, 14, 15],
               [16, 17, 18]]
               ]]
    strides = [1, 1]
    kernel = [2, 2]
    dilations = [1, 1]
    rounding_type = "floor"
    auto_pad = "explicit"
    pads_begin = [0, 0]
    pads_end = [0, 0]
    axis = 2
    output0 = [[[[5, 6],
                 [8, 9]],
                [[14, 15],
                 [17, 18]]]]
    output1 = [[[[4, 5],
                 [7, 8]],
                [[4, 5],
                 [7, 8]]]]
    

例:

<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>
        <port id="2">
            <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>
        <port id="2">
            <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>
        <port id="2">
            <dim>1</dim>
            <dim>3</dim>
            <dim>16</dim>
            <dim>16</dim>
        </port>
    </output>
</layer>