22 池化層【動手學深度學習v2】

卷積層對矩陣中的位置信息非常敏感:例如在檢測垂直邊緣問題中,只有識別出的垂直邊緣會置1,其余部分全為0,在實際應用中,會因為照明等因素邊緣會過于敏感(邊緣過薄)

池化層:降低卷積層對位置信息的過度敏感性
池化層種類:
1.二位最大池化:取池化窗口中的最大值

最大池化層應用例:對卷積輸出進行一次二位最大池化,使邊緣可容1像素移位。

注:池化層沒有可學習的參數(shù),且池化層輸出通道數(shù)=輸入通道數(shù)

2.平均池化層


代碼實現(xiàn)
輸出池化窗口中的最大值或平均值
import torch from torch import nn from d2l import torch as d2l def pool2d(X, pool_size, mode='max'): 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
驗證二維最大匯聚層的輸出
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]) pool2d(X, (2, 2))
tensor([[4., 5.], [7., 8.]])
驗證平均匯聚層。
pool2d(X, (2, 2), 'avg')
tensor([[2., 3.], [5., 6.]])
用深度學習框架中內置的二維最大匯聚層,來演示匯聚層中填充和步幅的使用。 我們首先構造了一個輸入張量X
,它有四個維度,其中樣本數(shù)和通道數(shù)都是1。
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4)) X
tensor([[[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.]]]])
默認情況下,深度學習框架中的步幅與匯聚窗口的大小相同(為了不重復池化)。 因此,如果我們使用形狀為(3,?3)
的匯聚窗口,那么默認情況下,我們得到的步幅形狀為(3,?3)
。
pool2d = nn.MaxPool2d(3) pool2d(X)
tensor([[[[10.]]]])
填充和步幅可以手動設定。
pool2d = nn.MaxPool2d(3, padding=1, stride=2) pool2d(X)
tensor([[[[ 5., 7.], [13., 15.]]]])
當然,我們可以設定一個任意大小的矩形匯聚窗口,并分別設定填充和步幅的高度和寬度。
pool2d = nn.MaxPool2d((2, 3), stride=(2, 3), padding=(0, 1)) pool2d(X)
tensor([[[[ 5., 7.], [13., 15.]]]])
在處理多通道輸入數(shù)據(jù)時,匯聚層在每個輸入通道上單獨運算,而不是像卷積層一樣在通道上對輸入進行匯總。 這意味著匯聚層的輸出通道數(shù)與輸入通道數(shù)相同。 下面,我們將在通道維度上連結張量X
和X?+?1
,以構建具有2個通道的輸入。
X = torch.cat((X, X + 1), 1) X
tensor([[[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [12., 13., 14., 15.]], [[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 9., 10., 11., 12.], [13., 14., 15., 16.]]]])
如下所示,匯聚后輸出通道的數(shù)量仍然是2。
pool2d = nn.MaxPool2d(3, padding=1, stride=2) pool2d(X)
tensor([[[[ 5., 7.], [13., 15.]], [[ 6., 8.], [14., 16.]]]])
補充知識:
池化層通常放在卷積層后
隨著機器算力的提高,池化層作為節(jié)省算力的技術應用的越來越少了
標簽: