深度学习-池化层
背景
位置敏感
X=[11000110001100011000]Y=[01000010000100001000]
X = \left[
\begin{matrix}
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
\end{matrix}
\right]
Y = \left[
\begin{matrix}
0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 \\
\end{matrix}
\right]
X=11111111000000000000Y=00001111000000000000
X代表原始的矩阵, Y代表边缘检测, 需要一定程度的平移不变形, 比如照明, 无题位置和外观等等图像不会因为剧烈的变化导致边缘检测失败
二维最大池化

每次根据窗口滑动作为输入数据, 得到输出, 然后通过max(0, 1, 3, 4)把最大的值拿出来也称为最大池化层
通过最大池化边缘检测
X=[11000110001100011000]Y=[01000010000100001000]Z=[11000110001100011000]
X = \left[
\begin{matrix}
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
\end{matrix}
\right]
Y = \left[
\begin{matrix}
0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 \\
\end{matrix}
\right]
Z= \left[
\begin{matrix}
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
1 & 1 & 0 & 0 & 0 \\
\end{matrix}
\right]
X=11111111000000000000Y=00001111000000000000Z=11111111000000000000
X代表垂直边缘检测, Y代表卷积输出, Z代表(2 * 2)最大池化效果
填充/步幅/通道
填充和步幅和卷积层类似, 没有可以学习的参数, 在每个输入通道应用池化层以获得相应的输出通道, 输出通道=输入通道
平均池化层
最大池化层: 每个窗口中最强的信号
平均池化层: 将最大池化层中的"最大"操作替换为平均
代码实现
import torch
from torch import nn
from d2l import torch as d2ldef pool2d(X, pool_size, mode='max'):p_h, p_w = pool_sizeY = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w))for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode == 'max': X[i, j] = X[i: i+p_h, j:j+p_w].max()elif mode == 'avg':X[i, j] = X[i: i+p_h, j:j+p_w].mean()return Y
每个通道单独计算
X = torch.cat((X, X + 1), 1)
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)
