填充 = 1 的 PyTorch MaxPool2D 意外行为
PyTorch MaxPool2D unexpected behavior with padding=1
我在 PyTorch
中使用 MaxPool2D
并在设置 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)
输出:
=== 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
这是预期的行为,因为负无穷大填充是默认完成的。
MaxPool 的文档现已修复。请参阅此 PR:Fix MaxPool default pad documentation #59404 .
文档在 Parameters
部分仍然不正确,它说:
padding – implicit zero padding to be added on both sides
我在 PyTorch
中使用 MaxPool2D
并在设置 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)
输出:
=== 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
这是预期的行为,因为负无穷大填充是默认完成的。
MaxPool 的文档现已修复。请参阅此 PR:Fix MaxPool default pad documentation #59404 .
文档在 Parameters
部分仍然不正确,它说:
padding – implicit zero padding to be added on both sides