在PyTorch的“MaxPool2D”中,填充是否取决于“ceil_mode”?

9
MaxPool2D中,默认情况下填充设置为0,ceil_mode也设置为False。现在,如果我有一个大小为7x7kernel=2,stride=2的输入,则输出形状变为3x3,但当我使用ceil_mode=True时,它变为4x4,这是有道理的,因为(如果以下公式正确),对于7x7output_shape将是3.5x3.5,取决于ceil_mode,它将是3x34x4
现在,我的问题是,如果ceil_mode=True,是否会更改默认的padding
如果是的话,那么它是如何添加填充的,即是先左边还是右边、先上方还是下方?
2个回答

7

Ceil_mode=True会改变填充方式。

在ceil模式下,除了向下和右侧添加附加列和行之外,不会在顶部和左侧添加。它不需要额外的一列。这也取决于步幅值。我只是写了一个小代码片段,您可以检查如何在两种模式下汇总填充值。

在发现上面引用的post之前,我以同样的方式对您的问题进行了实验,似乎在池化操作期间未使用零填充,在我的以下示例中,零将成为要采取的最大元素,但情况似乎并非如此。

    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.]]])


0
ceiling_mode = True时,Pytorch使用ceil而不是floor来计算输出形状。这相当于在右侧和/或底部填充一列。
以下是一个示例:
import torch
import torch.nn as nn
x = torch.rand(1, 1, 4, 3)
p = nn.MaxPool2d(2, ceil_mode=True)

print(x)
> tensor([[[[8.7051e-01, 7.7555e-01, 9.8731e-01],
            [9.9150e-01, 6.5547e-04, 5.2213e-01],
            [9.9981e-01, 9.8849e-01, 9.9986e-01],
            [8.4636e-01, 7.9657e-01, 6.3381e-01]]]])
print(p(x))
> tensor([[[[0.9915, 0.9873],
            [0.9998, 0.9999]]]])

在右侧添加了一列(值为-$\infty$)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接