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_begin
とpads_end
からの明示的なパディング値を使用します。same_lower (same_lower) - 入力は出力サイズに一致するようにパディングされます。パディング値が奇数の場合、追加のパディングが最後 (先頭) に追加されます。
valid - パディングを使用しません。
タイプ: 文字列
デフォルト値: explicit
必須: いいえ
注: auto_pad が explicit と等しくない場合、pads_begin と pads_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_pad
と rounding_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 は、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 は、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 は、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 は、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 は、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>