深度学习高手笔记(卷1):基础算法
上QQ阅读APP看书,第一时间看更新

1.2 更深:VGG

在本节中,先验知识包括:

AlexNet(1.1节)。

2014年,随着AlexNet在ImageNet数据集上大放异彩,使用深度学习探寻针对ImageNet数据集的最优网络成为提升在该数据集上精度的优先级最高的做法。牛津大学视觉几何组(Visual Geometry Group)的这篇论文[7]便提出了对CNN的深度和其性能进行探索的网络,该网络被命名为VGG。


[7] 参见Karen Simonyan、Andrew Zisserman 的论文“Very Deep Convolutional Networks for Large-Scale Image Recognition”。

VGG的结构非常清晰:

按照的池化层,网络可以分成若干个块(block);

每个块包含若干个same卷积,块内的特征图数量固定不变;

特征图的通道数按块以2倍的速度逐渐递增,第四块和第五块内特征图的通道数都是512(即64、128、256、512、512)。

VGG非常容易应用到其他数据集。在VGG中,块数每增加1,特征图的尺寸缩小一半,这么做是为了保证每一块的参数数量不会剧烈变化。通过减少块的数目也可以将网络应用到如MNIST、CIFAR等图像尺寸更小的数据集。块内的卷积数量是可变的,因为卷积的数量并不会影响特征图的尺寸,我们可以根据任务的复杂度自行调整块内的卷积数量。

VGG的表现效果也非常好,在2014年的ILSVRC物体分类任务中排名第二(第一名是GoogLeNet[8]),在物体检测任务中排名第一。


[8] 参见Christian Szegedy、Wei Liu 、Yangqing Jia 等人的论文“Going Deeper with Convolutions”。

VGG的模型开源在其官方网站上,为其他任务提供了非常好的迁移学习的材料,这使得VGG占有了大量商业市场。关于不同框架的VGG开源模型,读者可自行在网上搜索。

1.2.1 VGG介绍

“VGG家族”等各个类型的实现见随书资料,关于VGG家族的参数的具体设置可以总结为图1.11,图中包含大量信息,接下来我们一一进行分析。

图1.11 VGG家族

1.家族的特征

我们来看看VGG家族的共同特征:

输入图像均是的RGB彩色图像;

均采用5层最大池化,使用的均是same卷积,表示最终均会产生大小为的特征图,这是一个比较合适的大小;

特征层之后是两个隐层节点数目为4096的全连接层,最后是一个1000类softmax分类器;

所有VGG模型均可以表示为

VGG在卷积核方向的最大改进是将卷积核全部换成更小的或者的卷积核,而性能最好的VGG-16和VGG-19由且仅由的卷积核构成,原因有如下3点。

根据感受野的计算式,其中stride为模型的步长,ksize为卷积核的大小。我们知道一层的卷积核和3层的卷积核具有相同的感受野,但是由于3层感受野具有更深的深度,因此可以构建出更具判别性的决策函数。

假设特征图的数量都是C,3层卷积核的参数数量是,1层卷积核的参数数量是,3层卷积核具有更少的参数。

由于神经元数量和层数的增多,训练速度会变得更慢。

图1.12反映了VGG家族的各个模型的性能。

图1.12 VGG家族的各个模型的性能对比

图1.13展示了把LeNet-5的单层卷积换成两层卷积在MNIST上的收敛表现。论文中的实验表明两层卷积的网络确实比单层卷积的网络表现好,但是训练速度慢了二分之一。

另外,作者在前两层的全连接处使用丢失率为0.5的Dropout,然而并没有在图1.11中反映出来。

2.VGG-A vs VGG-A-LRN

VGG-A-LRN比VGG-A多了一个AlexNet介绍的LRN层,但是实验数据表明加入了LRN的VGG-A-LRN的错误率反而更高了,而且LRN的加入会更加占用内存,增加训练时间。

图1.13 单层卷积的LeNet与两层 卷积的LeNet对比

3.VGG-A、VGG-B、VGG-D和VGG-E

对比VGG-A(11层)、VGG-B(13层)、VGG-D(16层)、VGG-E(19层)的错误率,我们发现随着网络深度的增加,分类的错误率逐渐降低,当然深度越深表示需要的训练时间越长。但是当模型(VGG-D和VGG-E)到达一定深度时,网络的错误率趋于收敛,甚至偶尔会发生深层网络的错误率高于浅层网络的情况,这就是后面我们要介绍的退化问题。同时考虑网络的训练时间,我们需要折中考虑选择合适的网络深度。我相信作者一定探索了比VGG-E更深的网络,但是由于表现不理想并没有将其列在论文中。后面介绍的残差网络则通过残差机制将网络的深度从理论上扩展到了无限大。在后面的应用中,VGG-D和VGG-E得到了最为广泛的应用,它们更多的时候被叫作VGG-16和VGG-19。

4.VGG-B和VGG-C

VGG-C在VGG-B的基础上添加了3个的卷积。的卷积是在NIN[9]中率先使用的。由于卷积在不影响感受野的前提下提升了决策函数的容量,并且有通道融合的作用,因此实现了错误率的下降。


[9] 参见Min Lin 、Qiang Chen、Shwicheng Yan的论文“Network In Network”。

5.VGG-C和VGG-D

VGG-D将VGG-C中的卷积换成了卷积,该组对比表明卷积的提升效果要优于卷积。

6.VGG-D和VGG-E

当网络层数增加到16层时,网络的损失函数趋于收敛。当网络提升到19层时,虽然精度有了些许的提升,但需要的训练时间也大幅增加。

1.2.2 VGG的训练和测试

1.训练

VGG的训练分为单尺度训练(single-scale training)和多尺度训练(multi-scale training)。在单尺度训练中,原图的短边长度为一个固定值S(实验中S被固定为256或384),然后等比例缩放图片,再从缩放的图片中裁剪的子图用于训练模型。在多尺度训练中,每张图的短边长度为256到512之间的一个随机值,然后从缩放的图片中裁剪的子图。

2.测试

测试时可以使用和训练时相同的图片裁剪方法,然后通过若干不同裁剪的图片投票的方式选择最后的分类。

但测试的时候图片是单张输入的,使用裁剪的方式可能会漏掉图片的重要信息。在OverFeat[10]的论文中,提出了将整幅图作为输入的方式,过程如下。


[10] 参见Pierre Sermanet、David Eigen、Xiang Zhang等人的论文“OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks”。

(1)将测试图片的短边长度固定为QQ可以不等于S

(2)将Q输入VGG,在卷积网络的最后一个卷积,得到的特征向量,WH一般不等于7。

(3)将第一个全连接层看成的卷积层(原本需要先进行Flattern()操作,再进行全连接操作),对比随书资料中的VGG-E和使用全卷积的VGG-E-test,可以发现两者具有相同的参数数量。

(4)将第二个、第三个全连接层看成(numClasses指的是类别数)的卷积层。

(5)如果输入图片大小为,则输出的大小为,因为图片大小可以不一致,所以可以将输出看作某张图片多个切片的预测结果。最终经过加和池化,对每个通道求和,将得到的结果作为最终输出,即取所有切片的平均数作为最终输出。