参考链接
- https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter05_CNN/5.4_pooling
二维最大池化层和平均池化层
池化(pooling)层的提出是为了缓解卷积层对位置的过度敏感性。
同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。
二维最大池化
在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。
二维平均池化
二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。
def pool2d(X, pool_size, mode='max'):
X = X.float()
p_h, p_w = pool_size
Y = torch.zeros(X.shape[0] - p_h + 1, X.shape[1] - p_w + 1)
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode == 'max':
Y[i, j] = X[i: i + p_h, j: j + p_w].max()
elif mode == 'avg':
Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
return Y
填充和步幅
同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。
torch.nn模块里的二维最大池化层MaxPool2d实例里步幅和池化窗口形状相同。
pool2d = nn.MaxPool2d(3)
pool2d(X)
我们可以手动指定步幅和填充。
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)
我们也可以指定非正方形的池化窗口,并分别指定高和宽上的填充和步幅。
pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))
pool2d(X)
多通道
在处理多通道输入数据时,池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。
本文介绍了卷积神经网络中的池化层,包括最大池化和平均池化,阐述了它们的作用和工作原理。通过实例展示了如何在PyTorch中实现二维最大池化和平均池化,并讨论了填充和步幅对输出形状的影响。此外,还提到在处理多通道输入时池化层的特性。

1万+

被折叠的 条评论
为什么被折叠?



