《动手学深度学习》 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)
Convolutional Neural Network, CNN
卷积层
两个原则
我们从多层感知机开始,全连接层可以表示为:
平移不变性(translation invariance)
不管检测对象出现在哪,神经网络的前几层应对相同图像区域具有相似反应。
因此,和不依赖于的取值。
局部性(locality)
神经网络的前几层应只探索输入图像中的局部区域,不必过度在意图像中相隔较远区域。
因此,当或时,可令。
此即一个卷积层。
填充
conv2d = nn.Conv2d(1, 1, kernel_size=(5,3), padding=(2,1), bias=False)
卷积核的高度和宽度通常为奇数。选择奇数的好处是,当需要保持空间维度时,顶部和底部(左侧和右侧)填充的行数(列数)相等。
步幅
conv2d = nn.Conv2d(1, 1, kernel_size=(3,5), padding=(0,1), stride=(3,4))
多输入输出通道
多输入通道
对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和(将的结果相加)得到二维张量。
多输出通道
用到了torch.stack
函数
卷积层通常用于调整网络的通道数量和控制模型复杂性。
汇聚层
- 最大汇聚层(maximum pooling)
- 平均汇聚层(average pooling)
——取决于具体池化运算是取汇聚窗口中所有元素的最大值还是平均值
目的
- 降低卷积层对位置的敏感性
- 降低对空间降采样表示的敏感性
- 例如使用最大汇聚层,即使在高度或宽度上移动一个元素,卷积层仍然可以识别到模式。
实现
pool2d = nn.MaxPool2d((2,3), stride=(2,3), padding=(0,1))
LeNet
组成
- 卷积编码器:两个卷积层
- 全连接层密集块:三个全连接层
# LeNet-5 net = nn.Sequential( nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(), nn.AvgPool2d(kernel_size=2, stride=2), nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(), nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(), nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(), nn.Linear(120, 84), nn.Sigmoid(), nn.Linear(84, 10) )