因此,我目前正在构建一个2通道(也称为双通道)卷积神经网络,用于测量2(二进制)图像之间的相似性。
我遇到的问题如下:
我的输入图像是40 x 50,在经过1个转换和1个池化层之后(例如),输出尺寸为18 x23。那么,如何在不以非整数输出尺寸结束的情况下进行更多的池化呢?例如,将18 x 23的图像合并为2 x 2的大小,则输出大小由9 x 11.5给出。
我似乎找不到合适的内核大小来避免这种问题,我认为这是原始输入图像尺寸不是2的幂的事实的结果。例如,输入图像尺寸为64 x 64正确的填充尺寸等没有此问题。
非常感谢您的帮助。
答案 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
合并,还可以非对称填充,以及其他许多功能。所有这些都是您在构建模型时必须做出的决定:)