PyTorch MaxPool2D неожиданное поведение с отступом = 1 - PullRequest
1 голос
/ 15 февраля 2020

Я играл с MaxPool2D в PyTorch и обнаружил странное поведение при установке padding=1. Вот что я получил:

Код:

import torch
from torch.nn.functional import max_pool2d

TEST = 1


def test_maxpool(negative=False, tnsr_size=2, kernel_size=2, stride=2, padding=0):
    """Test MaxPool2D.
    """
    global TEST
    print(f'=== TEST {TEST} ===')
    print(*[f'{i[0]}: {i[1]}' for i in locals().items()], sep=' | ')

    inp = torch.arange(1., tnsr_size ** 2 + 1).reshape(1, tnsr_size, tnsr_size)
    inp = -inp if negative else inp

    print('In:')
    print(inp)

    out = max_pool2d(inp, kernel_size, stride, padding=padding)
    print('Out:')
    print(out)
    print()
    TEST += 1


test_maxpool()
test_maxpool(True)

test_maxpool(padding=1)
test_maxpool(True, padding=1)

Out:

=== TEST 1 ===
negative: False | tnsr_size: 2 | kernel_size: 2 | stride: 2 | padding: 0
In:
tensor([[[1., 2.],
         [3., 4.]]])
Out:
tensor([[[4.]]])

=== TEST 2 ===
negative: True | tnsr_size: 2 | kernel_size: 2 | stride: 2 | padding: 0
In:
tensor([[[-1., -2.],
         [-3., -4.]]])
Out:
tensor([[[-1.]]])

=== TEST 3 ===
negative: False | tnsr_size: 2 | kernel_size: 2 | stride: 2 | padding: 1
In:
tensor([[[1., 2.],
         [3., 4.]]])
Out:
tensor([[[1., 2.],
         [3., 4.]]])

=== TEST 4 ===
negative: True | tnsr_size: 2 | kernel_size: 2 | stride: 2 | padding: 1
In:
tensor([[[-1., -2.],
         [-3., -4.]]])
Out:
tensor([[[-1., -2.],
         [-3., -4.]]])

Тесты 1, 2, 3 в порядке, но Тест 4 странный, я ожидал получить [[0 0], [0 0]] тензор:

In:
[[-1 -2]
 [-3 -4]]

+ padding -> 

[[ 0  0  0  0]
 [ 0 -1 -2  0]
 [ 0 -3 -4  0]
 [ 0  0  0  0]]

-> kernel_size=2, stride=2 ->

[[0 0]
 [0 0]]

Согласно Тест 3 было использовано заполнение нулями, но тест 4 дал противоречивый результат.

Что это за заполнение (если оно было)? Почему MaxPool2D так себя ведет?

pytorch 1.3.1

...