プーリング演算子の形状計算ルール#

数学定式化

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

  • auto_pad = explicitrounding_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 = explicitrounding_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])

  • 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_typeceil_torch に設定されている場合、次元内の最後のプーリング操作はパディング領域で開始できません。この場合、それぞれの次元は 1 つ減少します。詳しい内容については、PyTorch の問題に関するディスカッションをご覧ください。

  1. 例 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. 例 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. 例 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. 例 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. 例 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. 例 6 は、2D カーネル、auto_pad = validrounding_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. 例 7 は、拡張 2D カーネル、auto_pad = explicitrounding_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. 例 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)