关于 Pytorch 中的奇数图像尺寸

Emi*_*kes 5 python machine-learning deep-learning pytorch

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

我遇到的问题如下:

我的输入图像是 40 x 50,在 1 个卷积层和 1 个池化层之后(例如),输出大小是 18 x 23。那么如何在不以非整数输出大小结束的情况下进行更多池化呢?例如,将大小为 2 x 2 的 18 x 23 图像池化,输出大小为 9 x 11.5。

我似乎找不到任何合适的内核大小来避免这样的问题,在我看来,这是因为原始输入图像尺寸不是 2 的幂。例如,大小为 64 x 64 的输入图像没有有正确的填充大小等问题。

任何帮助深表感谢。

Ber*_*iel 9

关于你的问题:

那么如何在不以非整数输出大小结束的情况下进行更多池化呢?

假设你有:

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]]]])
Run Code Online (Sandbox Code Playgroud)

如果你应用池化(我将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]]]])
Run Code Online (Sandbox Code Playgroud)

如果你想有一个[1, 1, 2, 2],你可以设定ceil_mode=TrueMaxPooling

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]]]])
Run Code Online (Sandbox Code Playgroud)

您还可以填充音量以实现相同的效果(这里我假设音量min=0就像在 ReLU 之后一样):

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]]]])
Run Code Online (Sandbox Code Playgroud)

关于:

我似乎找不到任何合适的内核大小来避免这样的问题,在我看来,这是因为原始输入图像尺寸不是 2 的幂。

好吧,如果你想使用将输入大小改变一半的池化操作(例如,MaxPoolingkernel=2stride=2),那么使用形状为 2 的幂的输入是非常方便的(毕竟,你将能够做很多这些 /2 操作)。然而,这不是必需的。你可以改变池化的步幅,你可以总是池化ceil_mode=True,你也可以不对称地填充,以及许多其他的东西。所有这些都是您在构建模型时必须做出的决定:)