В PyTorch "MaxPool2D" добавляется ли заполнение в зависимости от "ceil_mode"? - PullRequest
6 голосов
/ 25 января 2020

В MaxPool2D заполнение по умолчанию установлено на 0, а ceil_mode также установлено на False. Теперь, если у меня есть вход размером 7x7 с kernel=2,stride=2, форма вывода становится 3x3, но когда я использую ceil_mode=True, он становится 4x4, что имеет смысл, потому что (если следующая формула верна) для 7x7 с output_shape будет 3.5x3.5 и в зависимости от ceil_mode будет 3x3 или 4x4.

Теперь, мой вопрос, если ceil_mode=True, это изменит значение по умолчанию padding?

Если это так, то как он добавляет заполнение, т. Е. Добавляет ли оно отступ сначала слева или справа, сначала вверх или вниз?

1 Ответ

3 голосов
/ 11 февраля 2020

Ceil_mode = True изменяет заполнение.

В случае режима ceil дополнительные столбцы и строки добавляются как справа, так и внизу. (Не сверху и не слева). Это не должен быть один дополнительный столбец. Это также зависит от значения шага. Я только что написал небольшой фрагмент кода, где вы можете проверить, как заполненные значения объединяются в любом режиме.

Прежде чем я нашел запись , на которую ссылались выше, я тоже экспериментировал с вашей проблемой, также кажется, что заполнение нулями не используется во время операции объединения, так как в моем следующем примере нули были бы максимальными элементами, которые нужно взять, но, похоже, это не так.

    test_tensor = torch.FloatTensor(2,7,7).random_(-10,-5)
    print(test_tensor)
    max_pool = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=True)
    print(max_pool(test_tensor))
    max_pool = nn.MaxPool2d(kernel_size=2, stride=2, ceil_mode=False)
    print(max_pool(test_tensor))

Случайный тензор выборки:

    tensor([[[ -6.,  -9.,  -7., -10.,  -6.,  -8.,  -6.],
             [-10., -10., -10.,  -6., -10.,  -9.,  -6.],
             [-10.,  -7.,  -7.,  -8., -10., -10.,  -9.],
             [ -8., -10., -10.,  -9.,  -9., -10.,  -9.],
             [ -8.,  -6.,  -8.,  -6.,  -7.,  -7.,  -9.],
             [-10.,  -8.,  -7., -10.,  -9.,  -6.,  -8.],
             [-10.,  -6.,  -9., -10.,  -9.,  -9., -10.]],

            [[-10.,  -8.,  -6., -10.,  -9.,  -6.,  -7.],
             [ -7.,  -7., -10., -10.,  -6.,  -9.,  -7.],
             [ -6., -10.,  -7.,  -8.,  -8., -10.,  -9.],
             [ -8.,  -8.,  -6.,  -7.,  -6.,  -8.,  -6.],
             [ -9.,  -8.,  -7., -10.,  -8.,  -8.,  -7.],
             [-10., -10.,  -6.,  -9.,  -8.,  -8.,  -8.],
             [-10.,  -6.,  -9.,  -9.,  -7.,  -9., -10.]]])

ceil_mode = True


    tensor([[[ -6.,  -6.,  -6.,  -6.],
             [ -7.,  -7.,  -9.,  -9.],
             [ -6.,  -6.,  -6.,  -8.],
             [ -6.,  -9.,  -9., -10.]],

            [[ -7.,  -6.,  -6.,  -7.],
             [ -6.,  -6.,  -6.,  -6.],
             [ -8.,  -6.,  -8.,  -7.],
             [ -6.,  -9.,  -7., -10.]]])

ceil_mode = False

    tensor([[[-6., -6., -6.],
             [-7., -7., -9.],
             [-6., -6., -6.]],

            [[-7., -6., -6.],
             [-6., -6., -6.],
             [-8., -6., -8.]]])

...