Я играл с 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