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