d2l自学笔记 – 6.卷积神经网络

《动手学深度学习》 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)

Convolutional Neural Network, CNN

卷积层

两个原则

我们从多层感知机开始,全连接层可以表示为:
[H]i,j=[U]i,j+kl[W]i,j,k,l[X]k,l=[U]i,j+ab[V]i,j,a,b[X]i+a,j+b\begin{aligned} {[\mathbf{H}]_{i, j} } &=[\mathbf{U}]_{i, j}+\sum_{k} \sum_{l}[W]_{i, j, k, l}[\mathbf{X}]_{k, l} \\ &=[\mathbf{U}]_{i, j}+\sum_{a} \sum_{b}[V]_{i, j, a, b}[\mathbf{X}]_{i+a, j+b} \end{aligned}

平移不变性(translation invariance)

不管检测对象出现在哪,神经网络的前几层应对相同图像区域具有相似反应。

因此,VVU\mathbf{U}不依赖于(i,j)(i,j)的取值。

[H]i,j=u+ab[V]a,b[X]i+a,j+b[\mathbf{H}]_{i, j}=u+\sum_{a} \sum_{b}[\mathbf{V}]_{a, b}[\mathbf{X}]_{i+a, j+b}

局部性(locality)

神经网络的前几层应只探索输入图像中的局部区域,不必过度在意图像中相隔较远区域。

因此,当a>Δ|a|>\Deltab>Δ|b|>\Delta时,可令[V]a,b=0[\mathbf{V}]_{a, b}=0

[H]ij=u+a=ΔΔb=ΔΔ[V]a,b[X]i+a,j+b[\mathbf{H}]_{i j}=u+\sum_{a=-\Delta}^{\Delta} \sum_{b=-\Delta}^{\Delta}[\mathbf{V}]_{a, b}[\mathbf{X}]_{i+a, j+b \cdot}

此即一个卷积层。

填充

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))

多输入输出通道

多输入通道

对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和(将cic_i的结果相加)得到二维张量。

多输出通道

用到了torch.stack函数

1×11\times1卷积层通常用于调整网络的通道数量和控制模型复杂性。

汇聚层

  • 最大汇聚层(maximum pooling)
  • 平均汇聚层(average pooling)
    ——取决于具体池化运算是取汇聚窗口中所有元素的最大值还是平均值

目的

  • 降低卷积层对位置的敏感性
  • 降低对空间降采样表示的敏感性
  • 例如使用2×22\times 2最大汇聚层,即使在高度或宽度上移动一个元素,卷积层仍然可以识别到模式。

实现

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)
)

发表评论

%d 博主赞过: