关于你的问题:
那么如何在不产生非整数输出大小的情况下进行更多池化呢?
假设您有:
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
在这个例子中,我假设你的意思是 2x2 池化stride=2
基于您预期的输出形状):
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
of 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]]]])
您还可以填充音量以实现相同的效果(这里我假设音量有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]]]])
关于:
我似乎无法找到任何合适的内核大小来避免这样的问题,在我看来,这是由于原始输入图像尺寸不是 2 的幂这一事实造成的。
好吧,如果您想使用将输入大小更改一半的池化操作(例如,MaxPooling 与kernel=2
and stride=2
),那么使用 2 次方形状的输入就相当方便了(毕竟,您将能够执行许多这样的 /2 操作)。然而,这不是必需的。您可以更改池的步幅,您可以随时池与ceil_mode=True
,您还可以不对称地填充,以及许多其他东西。所有这些都是您在构建模型时必须做出的决定:)