到这里我们就学完了卷积神经网络相关的知识了,在学习的过程中,你是否有这样的困扰:如果是我自己构建一个卷积神经网络,怎样才能构建一个最优的模型呢;卷积层应该有几层,卷积核改多大,哪些层之后需要加池化层,dropout 应该用在哪……

其实,在实际应用中我们很少会从头搭建一个卷积神经网络,除非是找不到可以用的了。业界中的精英、大师已经设计出很多经典的卷积神经网络了,这些卷积神经网络在 ImageNet 上都取得了非常优异的成绩,我们普通人设计的网络结构很难超越他们。

接下来,我会为你介绍 3 个图像分类中常用的卷积神经网络:VGG、ResNet、SENet。但说到图像分类,就不得不先提一下 ImageNet

ImageNet

ImageNet 包含一个图像数据集,这个数据集是根据词汇网络(目前只有名词)组织起来的,网络中的每一个节点是由成千上万张图片组成的。现在的 ImageNet 平均每一个节点有 500 张图片。

从 2010 年开始,ImageNet 每一年都会举办一次有关计算机视觉的比赛,也就是著名的 ImageNet 大规模视觉识别挑战赛(The ImageNet Large Scale Visual Recognition Challenge,ILSVRC)。图像分类是比赛中的一个子任务。除了图像分类,比赛还有目标检测、图像分割等其他子任务。

ImageNet 图像分类的比赛使用了一份有 1000 个类别的数据进行训练与评估。从 2012 年开始,伴随着深度学习的发展,几乎每年都有非常经典的网络结构诞生。下图为历年来 ImageNet 上 Top-5 的错误率。

图卷积网络前向传播 图卷积网络 图像分类_卷积神经网络


图 1:历年来 ImageNet 上 Top-5 的错误率


2012 年之前,ImageNet 上的冠军基本都是一些浅层的算法;2012 年的 AlexNet 算是卷积神经网络在 ImageNet 的开山之作,大大降低了 Top-5 的错误率;2017 年,SENet 是最后一届图像分类比赛的冠军。

最后一个柱状图是人眼在 ImageNet 上 Top-5 的错误率。可以发现,从 ResNet 开始,机器分类的准确性已经高于人眼了。

2017 年之后,ImageNet 中就不再包含分类比赛了,但这并不是说没有新的网络结构诞生了。在 17 年之后依然诞生了很多优秀的网络结构,例如 DenseNet、EfficentNet。

说了这么多,那我们为什么要使用这些网络呢?

正如刚才所说,在实际中我们很少会自己设计网络结构。有多少层,每一层的卷积核是多少……这些问题很难自己确定,所以我们一般直接使用经典的网络结构。

在目标检测、图像分割中需要从图像中提取信息,我们通常使用这些经典的网络结构作为基础网络来提取图像中的特征。

AlexNet 虽然在当时取得了显著的效果,但从现在卷积神经网络的发展来看,除了个人学习之外,在实际中几乎不会使用 AlexNet,但我们在实践中是绕不开它的思想的。

我会在《17|图像分类:实现你的第一个图像分类实战项目》中简单介绍一下 AlexNet,然后使用 Tensorflow 搭建一个 AlexNet 并训练它。

好了,现在我们就可以来看看 VGG、ResNet 与 SENet 这 3 种网络结构了。

VGG

与 AlexNet 相比,VGG 在 ImageNet 的分类比赛的错误率大幅下降,取得了 ILSVRC 2014 比赛分类项目的第 2 名和定位项目的第 1 名。

这是 VGG 论文的地址https://arxiv.org/abs/1409.1556

VGG 探索了卷积神经网络的深度与其性能之间的关系,它证明通过加深卷积神经网络的深度,可以获得性能更好的模型。

VGG 比较彻底地采用 3x3 小尺寸的卷积,代替了 AlexNet 中采用的大尺寸卷积(11x11,7x7,5x5):通过堆叠卷积核为 3x3 的 2 层卷积,代替卷积核为 5x5 的 1 层卷积;堆叠卷积核为 3x3 的 3 层卷积,代替卷积核为 7x7 的 1 层卷积。

堆叠小卷积核可以保证感受野大小不变的条件下替代大卷积核,这样做有两个优点:一是可以减少参数量;二是能够通过多个小卷积核的堆叠加深层数,比一个大卷积核具有更多非线性

那为什么参数量会降低呢?

假设C_I 代表输入特征图的通道数,C_O 输出的通道数。有一个卷积核为 7x7、滑动步长为 1 的卷积层,它的参数量为 77C_I*C_O = 49 * C_I * C_O。堆叠 3 个卷积核为 3x3 的卷积层时,参数量为 3*(33C_I*C_O) = 27 * C_I * C_O,可以看到,参数量减少了。

网络结构

VGG 的各种版本结构非常一致。通过反复堆叠 3x3 的小型卷积和 2x2 的 max pooling 层,我们成功构筑了 16 层的 VGG 与 19 层的 VGG 网络,通常称为 VGG16 和 VGG19。

VGG16 与 VGG19 最为常用,VGG19 效果最好,但是参数多,对模型大小有要求时,会更加倾向于用 VGG16。

具体网络结构如下表的 A 到 E 所示:

图卷积网络前向传播 图卷积网络 图像分类_深度学习_02


图 2:VGG 的网络结构


训练方式

VGG 在 ImageNet 的比赛中,采用如下方式训练。

VGG 网络的输入尺寸是 224x224 的 RGB 图像,唯一的前处理是减去 RGB 的均值;batch size 为 256;momentum 为 0.9;在前 2 个全联接层设置 dropout,比例为 0.5;learning rate:初始化学习率为 0.01。

ResNet

ResNet(Deep Residual Learning network)中文为残差神经网络,是由微软亚洲研究院(何凯明团队)提出的卷积神经网络。ResNet 的论文《Deep Residual Learning for Image Recognition》是 CVPR 2016 的最佳论文。

在 ILSVRC 2015 中,ResNet 取得了分类比赛的冠军,网络层数比 VGG 深 8 倍。它将 1000 类图片 top-5 的错误率降低到 3.57%,首次超越了人眼的分类能力。

更深的网络

何凯明在论文中指出:在 2010 年之前,有关图像识别的算法大多都是浅层的结构;从 12 年深度学习取得重大进步开始,各项研究已经证明随着网络层数的加深,模型会取得更好的效果。

事实也的确如此:从浅层模型到 8 层的 AlexNet,Top-5 的错误率由 25.8 降低到 16.4,19 层的 VGG 将 Top-5 的错误率降低到 7.3,22 层的 GoogleNet 将 Top-5 的错误率降低到 6.7。

图卷积网络前向传播 图卷积网络 图像分类_深度学习_03


图 3:ImageNet 上错误率与网络深度的关系


在 2015 的 ImageNet 图像分类比赛中,何凯明提出的 ResNet 将网络的层数扩展到 152 层,并成功将 Top-5 的错误率降低到 3.57。

既然网络越深,对应的模型效果就越好,那是不是简单地堆叠网络就可以获得一个不错的模型了?并不是这样的。在论文中作者解释了,如果只是简单地堆叠网络,除了网络容易过拟合、难以训练,还会随着网络深度的增加出现另外两个问题:梯度消失或梯度爆炸,以及网络退化。

梯度消失、梯度爆炸

梯度消失与梯度爆炸的原因我在之前介绍过很多次,你如果忘了不妨回顾一下。其实通过正则化、选择激活函数等方法,在很大程度上可以避免梯度消失与梯度爆炸的问题。

网络退化

网络退化是指一个网络可以开始收敛时,随着网络层数的增加,网络的精度逐渐达到饱和,并且会迅速降低。这里的精度降低并不是过拟合造成的

论文中做了这样的一个实验:通过搭建一个 20 层卷积神经网络与一个 56 层的卷积神经网络,并在 CIFAR-10 数据集上进行了验证。

无论训练集误差还是测试集误差,56 层的网络均高于 20 层的网络:

图卷积网络前向传播 图卷积网络 图像分类_人工智能_04


图 4:20 层卷积神经网络与 56 层的卷积神经网络对比


作者认为网络退化这一问题与既有的认知稍有不符。

我们考虑一个浅层的网络与一个对应的深层网络,深层网络的构建方式是在这个浅层网络的基础上添加一些恒等映射。理论上这个更深的网络不会比浅层次网络更差,但是目前手头的实验没有一个能超过或者与浅层模型效果相当的。

残差学习

从网络退化问题中可以发现,堆叠多层的非线性网络似乎很难学会到恒等变化。为了改善网络退化问题,何凯明提出了一种深度残差学习的框架。

我们对一些连续的卷积层的输入做一下指定,x 是某一些层的输入,H(x)是这些层的输出。那么,残差变化为 F(x)=H(x)-x,原有的变化 H(x)变为 F(x) + x,即 H(x) = F(x) + x。

残差神经网络就是让网络学习残差变化 F(x),优化残差变化要比优化原有的变化更加容易一些。因为这些连续的卷积层可以学习从 x 到 H(x)的变换,所以同样可以学习到它的残差变化 F(x)=H(x)-x。

Shortcut Connection

残差学习通过一种叫作 shortcut connection 的机制实现。在残差神经网络中,shortcut connection 就是恒等变换(下图中带有 x identity 的曲线),包含 shortcut connection 的几层网络我们称为残差块。

图卷积网络前向传播 图卷积网络 图像分类_深度学习_05


图 5: 残差块


残差块被定义为 y=F(x,Wi)+x。x 与 y 是残差块的输入与输出,F(x,Wi)为残差,是网络要学习的内容。

在上图中,残差块中包含 2 层卷积层,因此在上图的残差 F 定义为 F=W2σ(W1x)。其中,σ 为Relu,σ(W1x) 为输入经过第一层卷积层变化后的输出,W2σ(W1x) 为第二层的输出。

函数 F 比较灵活,一般建议为 2 层或者 3 层,也就是一个残差块中有 2 层或者 3 层。

网络架构

我们来看一下残差神经网络在 ImageNet 中的网络结构:

图卷积网络前向传播 图卷积网络 图像分类_卷积神经网络_06


图 6:残差神经网络在 ImageNet 中的网络结构


从图中可以看到,101 层与 152 层的残差神经网络效果更好,但是受硬件设备以及推断时间限制,50 层的残差神经网络在实际中更为常用。

作者利用 20 层、32 层、44 层、56 层的普通网络与 20 层、32 层、44 层、56 层、110 层、 1202 层的残差神经网络在 CIFAR-10 上对比,然后证明残差神经网络可以解决网络退化的问题,即:利用残差神经网络可以训练出网络更深、效果更好的模型。实验结果如下图所示:

图卷积网络前向传播 图卷积网络 图像分类_深度学习_07


图 7:普通网络与残差神经网络对比图


上图中虚线为训练误差,实线为测试误差;左图为普通神经网络的实验结果,可以发现随着层数的增多网络会产生退化现象;中图为残差神经网络的实验结果,可以发现随着层数的增多网络没有产生退化现象;右图为 110 层与 1202 层的残差神经网络的实验结果。

SENet

SENet 是 ILSVRC 2017 分类任务的冠军,由 Momenta 团队提出,它将 top-5 的错误率减小到 2.251%,相比于 2016 的冠军的成绩提高了 25%。你可以点击链接查看 SENet 的论文。

卷积神经网络是构建于卷积的网络,卷积可以提取图像中的空间信息与通道间的信息。在 SENet 之前,经典 CNN 中都是通过调整网络的内部结构来获得更好的分类效果,而 SENet 提出了新的思路与结构。

SENet 发现了通道之间的关系,使网络获得了一个自动重新校准的机制,而不是通过调整网络结构来提升网络的性能。

新思路的实现方式是一个叫作“Squeeze-and-Excitation”(简称 SE Block)的模块,它是 SENet 的核心。

SENet 与残差神经网络类似:残差神经网络的核心是残差块,而残差块与 SE Block 都是即插即用的结构。

SE Block

SE Block 是一个计算单元。1 个 SE Block 有 2 个阶段:一是 Squeeze 阶段(下图中的 Fsq 函数),另一个是 Exciation 阶段(下图中的 Fex 函数)。

图卷积网络前向传播 图卷积网络 图像分类_卷积神经网络_08


图 8: SE Block


上图中,X 与 U 是两个特征图,从 X 到 U 是一个普通的卷积变换,X 与 U 的定义如下:

图卷积网络前向传播 图卷积网络 图像分类_图卷积网络前向传播_09

我们用 V=[v1, v2, .... vc]表示从 X 到 U 的卷积核,其中 vc 表示第 c 个卷积核。X 经过卷积层 V 后的输出为:U=[u1, u2, ..., uc],其中:

图卷积网络前向传播 图卷积网络 图像分类_卷积_10

*为卷积操作。

Squeeze 阶段

为了能确定各个通道之间的关系,我们需要先获得每一个通道的描述信息,这个阶段叫作 squeeze。

那如何获得这个描述信息呢?论文的作者对特征图的每一个通道都做了取平均操作,平均之后的那个值就作为当前通道的描述,计算方式如下:

图卷积网络前向传播 图卷积网络 图像分类_人工智能_11

取平均之后会生成一个(1, 1, C)的特征图,这个特征图中的每一个数值代表着 U 中的每一层的全局信息。

Excitation 阶段

为了使用 squeeze 阶段提取到的特征,在 sequeeze 阶段之后会接一个 Excitation 操作。Excitation 操作会根据 squeeze 阶段获得的信息计算每一个通道的权重,也就是每一个通道的重要性。获得权重之后,再通过乘法将权重加权到之前的特征图中,这样就完成了对原始特征图的加权。

作者通过 2 个全连接层来获得权重,计算公式如下:

图卷积网络前向传播 图卷积网络 图像分类_深度学习_12

其中,σ 为 Relu,squeeze 输出的维度是(1, 1, C)。

第一个全连接层会将 squeeze 的输出降维到(1, 1, C/r),其目的是减少计算量。在论文中,通过实验对比,r 的最优值是 16。

第一层的输出之后会接一个 Relu 函数,保证其维度不变。

然后进入第二个全连接层。第二个全连接层会将维度恢复到(1, 1, C),它输出的值就是每个通道的权重。

最后利用公式,对原始的特征图进行加权,找到通道间的关系,使对分类帮助大的通道有较大的权重,对分类没有影响或者影响较小的通道获得较小的权重。公式如下:

图卷积网络前向传播 图卷积网络 图像分类_图卷积网络前向传播_13

SE-Block 作为一个即插即用的模块,可以将 SE 模块插入到任何原始的网络中,构成不同的 SENet。例如:SE-ResNet、SE-Inception、SE-ReNeXt。

下面是一个 SE-Inception 的例子。左侧是原始 Inception 模块,右侧是添加 SE 模块之后。

图卷积网络前向传播 图卷积网络 图像分类_卷积神经网络_14


图 9:SE-Inception


下图是一个 SE-ResNet 的例子。左侧是原始 Residual 模块,右侧是添加 SE 模块之后。

图卷积网络前向传播 图卷积网络 图像分类_图卷积网络前向传播_15


图 10:SE-ResNet


总结

我们今天学习了 3 个较为常用的卷积神经网络,但这并不是全部的目前可用的卷积神经网络。今天介绍的内容希望能达到一个抛砖引玉的作用,为其他网络结构的学习打好基础。

在“图 2:VGG 的网络结构”的最后,有 3 个全连接层:FC-4096、FC-4096 与 FC-1000。数字分别代表 4096 个神经元与 1000 个神经元,那么你知道为什么最后一层是 1000 个神经元吗?欢迎在留言区留言,或是在微信群中讨论。

下一讲,我将带你进入图像分类的实战,在实际训练一个卷积神经网络的同时继续补充 Tensorflow 相关的知识。