参考
5.4 池化层
在本节中我们介绍池化(pooling)层,它的提出是为了缓解卷积层对位置的过度敏感性。
5.4.1 二维最大池化层和平均池化层
池化层直接计算池化窗口内元素的最大值或者平均值。该运算也叫做最大池化层或平均池化层。
下面把池化层的前向计算实现在pool2d函数里。
import torch
import torch.nn as nndef pool2d(X, pool_size, mode="max"):X = X.float()p_h, p_w = pool_sizeY = 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
X = torch.tensor([[0,1,2], [3,4,5], [6,7,8]])
pool2d(X, (2, 2))
下面验证一下平均池化层
pool2d(X, (2,2),'avg')
5.4.2 填充和步幅
池化层也可以定义填充和步幅
X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4))
X
默认情况下,MaxPool2d实例里步幅和池化窗口形状相同。下面使用形状为(3, 3)的池化窗口,默认获得形状为(3, 3)的步幅。
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)
5.4.3 多通道
池化层对每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加.
X = torch.cat((X, X + 1), dim=1)
X
池化后,我们发现输出通道数仍然是2。