プーリング演算子の形状計算ルール#
数学定式化
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
- AvgPool は拡張属性をサポートしていないため、その場合は値を
1
に置き換える必要があることに注意してください。 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])
- AvgPool は拡張属性をサポートしていないため、その場合は値を
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
属性に従って丸められます。rounding_type
が ceil_torch
に設定されている場合、次元内の最後のプーリング操作はパディング領域で開始できません。この場合、それぞれの次元は 1
つ減少します。詳しい内容については、PyTorch の問題に関するディスカッションをご覧ください。
例
例 1 は、2D カーネルと
auto_pad = explicit
を使用して MaxPool が 4D 入力でどのように動作するかを示しています。input = [[[[-1, 2, 3], [4, 5, -6], [-7, 8, 9]]]] # shape: (1, 1, 3, 3) 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]]]] # shape: (1, 1, 4, 4) output1 = [[[[0, 1, 2, 2], [3, 4, 4, 5], [3, 7, 8, 8], [6, 7, 8, 8]]]] # shape: (1, 1, 4, 4)
例 2 は、1D カーネルと
auto_pad = valid
を使用して MaxPool が 3D 入力でどのように動作するかを示しています。input = [[[-1, 2, 3, 5, -7, 9, 1]]] # shape: (1, 1, 7) strides = [1] kernel = [3] rounding_type = "floor" auto_pad = "valid" output0 = [[[3, 5, 5, 9, 9]]] # shape: (1, 1, 5) output1 = [[[2, 3, 3, 5, 5]]] # shape: (1、1、5)
例 3 は、2D カーネルと
auto_pad = same_lower
を使用して MaxPool が 4D 入力でどのように動作するかを示しています。input = [[[[-1, 2, 3], [4, 5, -6], [-7, 8, 9]]]] # shape: (1, 1, 3, 3) strides = [1, 1] kernel = [2, 2] rounding_type = "floor" auto_pad = "same_lower" output0 = [[[[-1, 2, 3], [4, 5, 5] [4, 8, 9]]]] # shape: (1, 1, 3, 3) output1 = [[[[0, 1, 2], [3, 4, 4], [3, 7, 8]]]] # shape: (1, 1, 3, 3)
例 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]]]] # shape: (1, 2, 3, 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]]]] # shape: (1, 2, 3, 3) output1 = [[[[4, 4, 2], [7, 8, 8], [7, 8, 8]], [[12, 11, 11], [15, 16, 14], [15, 16, 17]]]] # shape: (1, 2, 3, 3)
例 5 は、2D カーネルと
rounding_type = ceil_torch
を使用して MaxPool が 4D 入力でどのように動作するかを示しています。input = [[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]] # shape: (1, 1, 3, 3) strides = [2, 2] kernel = [2, 2] pads_begin = [1, 1] pads_end = [1, 1] rounding_type = "ceil_torch" output0 = [[[[1, 3], [7, 9]]]] # shape: (1, 1, 2, 2) output1 = [[[[0, 2], [6, 8]]]] # shape: (1, 1, 2, 2)
例 6 は、2D カーネル、
auto_pad = valid
、rounding_type = ceil
を使用して MaxPool が 4D 入力でどのように動作するか示しています。input = [[[[-1, 2, 3], [4, 5, -6], [-7, 8, 9]]]] # shape: (1, 1, 3, 3) strides = [2, 2] kernel = [2, 2] rounding_type = "ceil" auto_pad = "valid" output0 = [[[[5, 3], [8, 9]]]] # shape: (1, 1, 2, 2) output1 = [[[[4, 2], [7, 8]]]] # shape: (1, 1, 2, 2)
例 7 は、拡張 2D カーネル、
auto_pad = explicit
、rounding_type = floor
を使用して、MaxPool が 4D 入力でどのように動作するか示しています。input = [[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]] # shape: (1, 1, 3, 3) 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]]]] # shape: (1, 1, 3, 3) output1 = [[[[4, 5, 4], [7, 8, 7], [4, 5, 4]]]] # shape: (1, 1, 3, 3)
例 8 は、デフォルト以外の
axis
値を持つ 2D カーネルを使用して、MaxPool が 4D 入力でどのように動作するか示しています。
入力形状: (1,2,3,3) 出力形状: (1, 2, 2, 2)
input = [[[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]]] # shape: (1, 2, 3, 3) 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]]]] # shape: (1, 2, 2, 2) output1 = [[[[4, 5], [7, 8]], [[4, 5], [7, 8]]]] # shape: (1, 2, 2, 2)