1、卷积层对位置非常敏感,使用卷积层时,可能一个地方的轻微变动都会使结果发生变化,我们希望不要这么敏感,就有了池化层(更加柔和)。
2、二维最大池化:返回滑动窗口中的最大值,每个窗口中最强的模式信号
3、填充、步幅、多个通道
(1)对于CNN卷积核可学习是指,卷积核的数值不是预先固定的,而是在训练过程中通过反向传播算法自动调整和优化的。
(步骤:1. 初始化:卷积核的初始值通常是随机生成的。
2. 前向传播:在每一次前向传播中,卷积核对输入数据进行卷积操作,生成特征图。
3. 损失计算:通过与真实标签对比,计算损失函数的值。
4. 反向传播:根据损失函数,通过反向传播算法计算梯度。卷积核的数值会根据梯度信息进行更新,以使得损失函数的值逐渐减小。
5. 参数更新:使用优化算法(如梯度下降法),调整卷积核的值。)
4、平均池化层:将最大池化层中的“最大”操作替换为“平均”
5、总结
(1)池化层返回窗口中最大或平均值
(2)缓解卷积层会位置的敏感性
(3)同样有窗口大小、填充、和步幅作为超参数
(4)池化层通常作用在卷积层的最后
6、代码
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
(1)填充和步幅(跟卷积一样)
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4)) pool2d = nn.MaxPool2d((2, 3), stride=(2, 3), padding=(0, 1)) pool2d(X)
(2)多个通道
#前面定义的x已经是4维了,再stack就变成5维,而cat不改变维度 X = torch.cat((X, X + 1), 1) X
1 ==> X.shape: torch.Size([1, 2, 4, 4]);
0 ==> X.shape: torch.Size([2, 1, 4, 4])