关于Pytorch中的奇数图像尺寸

时间:2019-06-28 08:11:32

标签: python machine-learning deep-learning pytorch

因此,我目前正在构建一个2通道(也称为双通道)卷积神经网络,用于测量2(二进制)图像之间的相似性。

我遇到的问题如下:

我的输入图像是40 x 50,在经过1个转换和1个池化层之后(例如),输出尺寸为18 x23。那么,如何在不以非整数输出尺寸结束的情况下进行更多的池化呢?例如,将18 x 23的图像合并为2 x 2的大小,则输出大小由9 x 11.5给出。

我似乎找不到合适的内核大小来避免这种问题,我认为这是原始输入图像尺寸不是2的幂的事实的结果。例如,输入图像尺寸为64 x 64正确的填充尺寸等没有此问题。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

关于您的问题:

  

那么如何在不以非整数输出大小结束的情况下做更多的合并呢?

假设您拥有:

import torch
from torch import nn
from torch.nn import functional as F

# equivalent to your (18 x 23) activation volume
x = torch.rand(1, 1, 4, 3)

print(x)
# tensor([[[[0.5005, 0.3433, 0.5252],
#           [0.4878, 0.5266, 0.0237],
#           [0.8600, 0.8092, 0.8912],
#           [0.1623, 0.4863, 0.3644]]]])

如果您应用池化(在此示例中,我将使用MaxPooling,并且假设您是根据期望的输出形状使用stride=2进行2x2池化):

p = nn.MaxPool2d(2, stride=2)
y = p(x)

print(y.shape)
# torch.Size([1, 1, 2, 1])

print(y)
# tensor([[[[0.5266],
#           [0.8600]]]])

如果您想拥有[1, 1, 2, 2],则可以将ceil_mode=True的{​​{1}}设置为:

MaxPooling

您还可以填充该卷以达到相同的音量(这里我假设该卷具有p = nn.MaxPool2d(2, stride=2, ceil_mode=True) y = p(x) print(y.shape) # torch.Size([1, 1, 2, 2]) print(y) # tensor([[[[0.5266, 0.5252], # [0.8600, 0.8912]]]]) ,就像在ReLU之后一样):

min=0

关于:

  

我似乎找不到合适的内核大小来避免这种问题,我认为这是原始输入图像尺寸不是2的幂的事实的结果。

好吧,如果您想使用将输入大小减半的Pooling操作(例如,使用p = nn.MaxPool2d(2, stride=2) y = p(F.pad(x, (0, 1), "constant", 0)) print(y.shape) # torch.Size([1, 1, 2, 2]) print(y) # tensor([[[[0.5266, 0.5252], # [0.8600, 0.8912]]]]) kernel=2的MaxPooling),那么使用2的幂的形状的输入将非常方便(毕竟,您将可以执行许多这些/ 2操作)。但是,这不是必需的。您可以更改合并的步幅,可以始终与stride=2合并,还可以非对称填充,以及其他许多功能。所有这些都是您在构建模型时必须做出的决定:)