參考
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。