教材选用《动手学深度学习》,李沐等著;
卷积神经网络(CNN)是含有卷积层(convolutional layer)的神经网络,二维卷积层有高和宽两个空间维度,常用来处理图像数据。
卷积层
虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cross-correlation)运算。关于卷积运算和互相关运算的关系可以查看这里。
二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素 𝑥 的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做 𝑥 的感受野(receptive field)。
填充(padding)是指在输⼊⾼和宽的两侧填充元素(通常是0元素),每次滑动的⾏数和列数称为步幅(stride)。
彩⾊图像在⾼和宽2个维度外还有RGB(红、绿、蓝)3个颜⾊通道,假设彩⾊图像的⾼和宽分别是h和w(像素),那么它可以表⽰为⼀个3 × h × w的多维数组,我们将⼤小为3的这⼀维称为通道(channel)维。
池化层
池化(pooling)层的提出是为了缓解卷积层对位置的过度敏感性。不同于卷积层⾥计算输⼊和核的互相关性,池化层直接计算池化窗口内元素的最⼤值或者平均值,该运算也分别叫做最⼤池化或平均池化。
池化层填充和步幅与卷积层填充和步幅的⼯作机制⼀样,池化层在处理多通道输⼊数据时是对每个输⼊通道分别池化,而不是像卷积层那样将各通道的输⼊按通道相加。
代表性卷积神经网络
卷积神经⽹络(LeNet)
LeNet分为卷积层块和全连接层块两个部分。
卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模式,例如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。卷积层块由两个这样的基本单位重复堆叠构成。
卷积层块的输出形状为(批量大小,通道,高,宽)。当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。也就是说,全连接层的输入形状将变成二维,其中第一维为小批量中的样本,第二维为每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。
LeNet交替使⽤卷积层和最⼤池化层后接全连接层来进⾏图像分类。LeNet的详细结构可以查看这里。
深度卷积神经⽹络(AlexNet)
计算机视觉流程中真正重要的是数据和特征,使用较干净的数据集和较有效的特征甚至比机器学习模型的选择对图像分类的结果影响更大。
2012 年,AlexNet 横空出世。AlextNet 与 LeNet 的设计理念非常相似,但也有显著的区别。
第一,与相对较小的 LeNet 相比,AlexNet 包含 8 层变换,其中有五层卷积和两层全连接隐含层,以及一个全连接输出层。
第二,AlextNet 将 sigmoid 激活函数改成了更加简单的 ReLU 激活函数。
第三,AlextNet 通过丢弃法来控制全连接层的模型复杂度。
第四,AlextNet 引入了大量的图像增广,例如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。
AlexNet 跟 LeNet 结构类似,但使用了更多的卷积层和更大的参数空间来拟合大规模数据集 ImageNet。它是浅层神经网络和深度神经网络的分界线。AlextNet 的详细结构可以查看这里。
使⽤重复元素的⽹络(VGG)
VGG 提出了可以通过重复使用简单的基础块来构建深度模型的思路。VGG 块的组成规律是:连续使用数个相同的填充为 1、窗口形状为 3×3 的卷积层后接上一个步幅为 2、窗口形状为 2×2 的最大池化层。卷积层保持输入的高和宽不变,而池化层则对其减半。VGG的原始论文可以查看这里。
⽹络中的⽹络(NiN)
NiN是指串联多个由卷积层和“全连接”层构成的小⽹络来构建⼀个深层⽹络的思路。NiN 使用 1×1 卷积层来替代全连接层,下图对比了 NiN 同 AlexNet 和 VGG 等网络在结构上的主要区别。
NiN 块是 NiN 中的基础块。它由一个卷积层加两个充当全连接层的 1×1 卷积层串联而成。NiN 去除了容易造成过拟合的全连接输出层,而是将其替换成输出通道数等于标签类别数的 NiN 块和全局平均池化层。NiN的原始论文可以查看这里。
含并⾏连结的⽹络(GoogLeNet)
GoogLeNet 吸收了 NiN 中网络串联网络的思想,并在此基础上做了很大改进,在随后的几年里,研究人员也对 GoogLeNet 进行了数次改进。
GoogLeNet 中的基础卷积块叫做 Inception 块,这个基础块在结构上更加复杂。
Inception块相当于一个有四条线路的子网络。它通过不同窗口形状的卷积层和最大池化层来并行抽取信息,并使用 1×1 卷积层减少通道数从而减小模型复杂度。GoogLeNet目前经历了四个版本,我之前写过一篇关于Inception-v3的学习笔记,关于Inception改进的历史可以查看这里。
批量归一化
在模型训练时,批量归一化利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使得整个神经网络在各层的中间输出的数值更稳定。对全连接层和卷积层做批量归一化的方法稍有不同。
残差⽹络(ResNet)
在实践中,添加过多的层后训练误差往往不降反升,即使利用批量归一化带来的数值稳定性使得训练深层模型更加容易,这个问题仍然存在,针对这一问题提出了残差网络(ResNet)。
在残差块中,输入可通过跨层的数据线路更快地向前传播。ResNet 沿用了 VGG 全 3×3 卷积层的设计,而残差块通过跨层的数据通道从而能够训练出有效的深度神经网络。ResNet的原始论文可以查看这里。
稠密连接⽹络(DenseNet)
ResNet 中的跨层连接设计引申出了数个后续工作,其中稠密连接网络(DenseNet)与 ResNet 的主要区别如下图所示。
DenseNet 的主要构建模块是稠密块(dense block)和过渡层(transition layer)。前者定义了输入和输出是如何连结的,后者则用来控制通道数,使之不过大。DenseNet 的原始论文可以查看这里,DenseNet 的算法详解可以查看这里。