概述
VGGNet这篇论文最主要的贡献在于从网络深度这一角度出发,对卷积神经网络进行了改进。非常详尽的评估了网络深度所带来的影响,证明了网络的深度对于性能的提升具有举足轻重的作用。而且文中训练的两个16层和19层的网络由于其强大的泛化能力,在随后得到了非常广泛的应用。VGGNet的主要特点在于:(1)网络很深;(2)卷积层中使用的卷积核很小,且都是3*3的卷积核。
网络细节
1. Architecture
- 训练网络时,输入的图像大小是224*224的(测试时则不一定,原因后面会讲到),唯一的预处理步骤是减去均值。
- 所有的卷积层使用的都是3*3的卷积核(对比实验中用到了1*1的卷积核,它的作用在于引入更多的非线性。最终的VGG16和VGG19都不包含1*1的卷积核,所以它的出现只是为了做对比实验,后面部分会提到)。
- 为了使卷积后的feature map大小和卷积前相等,卷积核为3*3的卷积层的padding都设置为1。
- 使用max pooling,但并不是所有的卷积层后面都跟着pooling层,一共只有5个max pooling层。kernel大小是2*2,步长为2,也就是说,和AlexNet不同,VGGNet使用的是不重叠的pooling。
- 所有网络模型的最后三层都是全连接层。其中前两层都有4096个神经元,最后一层则是1000,每个代表一个分类类别。
- 所有的隐含层的激活函数都是ReLU函数,最后一层则是softmax层。
- 没有使用AlexNet中的LRN技术。这是因为后面的实验中证明了使用LRN对性能并没有提升作用,反而增加内存和时间消耗。
2. Configurations
为了评估深度对于网络性能的影响,文中设计了好几种不同深度的网络结构。最浅的网络有11层,最深的有19层,其中,所有的网络模型最后三层都是全连接层,其余都是卷积层。这几种网络模型的结构如下图:
3. Discussion
为什么使用3*3的卷积核?
3*3是能抓取局部信息的最小的尺寸。不难得到,两层3*3的卷积层便可以得到5*5的感受野,相当于一层5*5的卷积层。以此类推,三层3*3的卷积层相当于一层7*7的卷积层。那么为什么不直接使用大的卷积核,而是使用多层3*3的卷积层来起到类似的作用呢?原因主要有两点:
- 层数越多,非线性因素就越多,决策函数的判别力更强。
- 虽然使用小的卷积核时,需要的层数会更多,但是需要学习的参数反而更少了,可以将层数更多、卷积核更小看作是对大的卷积核强加了正则化。比如对于卷积核大小都为3*3,通道数目都是C的三层卷积层来说,参数的数目是3*(3*3*C*C)=27*C*C;而卷积核大小为7*7,通道数目也是C的一层卷积层来说,参数的数目为7*7*C*C=49*C*C。
1*1的卷积核有什么作用?
在不影响卷积层的感受野的情况下,为模型引入更多的非线性。不影响感受野是显而易见的,非线性是怎么来的呢?是由于非线性激活函数的使用。
训练和测试细节
训练
- batch size为256,momentum设置为0.9,权重衰减系数为0.0005。
- 前两层全连接层使用Dropout,Dropout比例为0.5。
- 学习率初始时为0.01,当验证集的准确率停止提高时,学习率除以10。最终学习率降低了三次以后,网络就收敛了。
- 虽然和AlexNet相比,VGGNet的参数更多、深度更深,但是却收敛的更快。原因有两点,一是前面提到的更深的层和更小的卷积核相当于隐式的进行了正则化;二是在训练期间对某些层进行了预初始化。
- 对于深度网络来说,网络权值的初始化十分重要。为此,论文中首先训练一个浅层的网络结构A(网络结构见上图),训练这个浅层的网络时,随机初始化它的权重就足够得到比较好的结果。然后,当训练深层的网络时,前四层卷积层和最后的三个全连接层使用的是学习好的A网络的权重来进行初始化,而其余层则随机初始化。这也就是上一点提到的某些层的预初始化。(随机初始化权重时,使用的是0均值,方差0.01的正态分布;偏置则都初始化为0)。
- 首先将图像各向同性的缩放,使得最短边缩放至S(S大于等于224),由于要求输入是224*224大小的,所以再对缩放后的图像进行crop。至于S的取值,论文提出了两种不同的方法:
(1)固定的尺度,对所有的图片,S都是固定的同样的值。论文考察了S=256和S=384两种情况下分别训练得到的网络的性能。为了加速,训练S=384的网络时,使用训练好的S=256的网络来初始化权重,并且学习率更小,为0.001。
(2)可变的尺度,设置一个范围[Smin,Smax],每一张图片都从这个范围内随机选取一个数作为它的S。论文中使用的范围是[256,512]。这使得训练在一个很大范围的图像尺度之上进行。为了加速,通过微调S=384的固定尺度的网络来训练得到可变尺度的网络。
测试
在测试阶段,首先将图像各向同性的缩放,使得最短边缩放至Q。注意,Q没必要一定要和S相等。然后,使用两种不同的方式进行分类:dense evaluation和multi-crop evaluation,这两种方式分别借鉴于Overfeat和GoogLeNet。下面详细介绍一下这两种方式:
1. dense evaluation
它的设计非常巧妙,并不需要我们显式的在缩放后的图像上crop出224*224的图像。而是直接将缩放后的图像输入,再通过将最后的三层全连接层表达为卷积层的形式,来实现在缩放后的图像上密集crop的效果。最后将结果平均得到最终的分类结果。
首先来看为什么全连接层可以转变为卷积层的形式。假设一个神经网路前面都是卷积层,后面跟着三层全连接层f1、f2和f3,每个全连接层神经元的个数分别为n1、n2和n3,且经过前面所有的卷积层之后,得到的是m*m的C个通道的feature map。一般来说,进入全连接层之前,我们应该首先将这个feature map展成一维向量,再于f1全连接层相连接。但是实际上,我们可以将f1层看作是卷积核大小为m*m,通道数为n1的卷积层,这样卷积后得到的输出是1*1*n1的(不加padding),效果和全连接层一样。然后,再将f2层看作是卷积核大小为1*1,通道数为n2的卷积层;将f3层看作是卷积核大小为1*1,通道数为n3的卷积层......道理同f1层一样。
上面证明了可以将全连接层转变为卷积层,下面来讲一下这么做的效果,为什么能起到密集crop的效果。 如下图所示(图片来自于论文Overfeat),假设训练时网络接受的图像大小是14*14,最后输出的是它所属的类别。假设测试时缩放后的图片大小为16*16,在将全连接层转变成卷积层后 ,我们将这个缩放后的图像直接输入给网络,而不是crop出14*14的大小,可以发现,最后得到的是4个结果而不是它上面所示的1个。其实这4个结果分别相当于在缩放后的图像上crop出左上、右上、左下、右下4个14*14图像的分类结果。然后将多个位置的结果取平均作为整个图像的最终结果。相比于在缩放后的图像上crop出多个图像后再分别放入网络进行分类,这种操作省去了许多重复性的运算,所有的卷积操作只需要做一遍即可。值得注意的是,在这个例子中,相当于每滑动两个像素crop一个图像,这是因为中间有一个步长为2的2*2的pooling操作。所以有时当pooling操作较多时,这种方法可能反而没有直接多次crop得到的结果精细。
2. multi-crop evaluation
相当于AlexNet中所使用的crop方法的加强版。在GoogleLeNet中描述的详细过程如下:将图片缩放到不同的4种尺寸(纵横比不变,GoogleLeNet使用的4种尺寸为:缩放后的最短边长度分别为:256,288,320和352)。对于得到的每个尺寸的图像,取左、中、右三个位置的正方形图像(边长就是最短边的长度。对于纵向图像来说,则取上、中、下三个位置),因此每个尺寸的图像得到3个正方形图像;然后再在每个正方形图像的4个crop顶点和中心位置处crop处224*224的图像,此外再加上将这个正方形图像缩放到224*224大小的图像,因此每个正方形图像得到6个224*224的图像;最后,再将所有得到的224*224的图像水平翻转。因此,每个图像可以得到4*3*6*2=144个224*224大小的图像。将这些图像分别输入神经网络进行分类,最后取平均,作为这个图像最终的分类结果。
而VGG中则使用的是3种尺寸,每个尺寸在5个位置处取正方形图像(四个顶点加中心?),每个正方形图像crop出5个224*224大小的图像,最后水平翻转,即3*5*5*2=150。
对比实验
1. 单尺度评估
评估上面提出的几个网络模型,测试时,对于固定的S,取Q=S;对于可变的S,取
Q=0.5 ( Smin+Smax)。实验结果如下:
- A-LRN是指应用了LRN的A网络结构,由上面的实验结果可以看到,和A网络相比,性能并没有提升。所以后面所有的网络结构都不使用LRN技术。
- 可以看到,分类误差随着网络深度的增加而降低。
- 值得注意的是,B和C拥有相同的3*3的卷积层数,只是C有额外的1*1的卷积层,结果表明C的性能优于B,说明额外的非线性可以提升网络的性能。
- 而C和D拥有相同的卷积层数,只是C有一些1*1的卷积层,而D只有3*3的卷积层,结果表明D的性能优于C,说明抓取空间局部信息也同样重要。
- 训练时,使用可变的尺度(尺度抖动)比固定的尺度效果更好。
2. 多尺度评估
多尺度估计,就是在测试时,将图像缩放到几个不同的尺度,即Q的取值有多个,再将每个尺度得到的结果取平均,得到最终的结果。对于固定的S,令Q={S-32,S,S+32};对于可变的S,令Q={Smin,0.5 ( Smin+Smax),Smax}。实验结果如下所示:
通过和单尺度的结果对比,可以发现在测试时使用多尺度(尺度抖动),可以提升准确率。
3. multi-crop评估
比较了上文提到的dense和multi-crop两种方法的性能,此外,还将这两种方法结合起来,得到了更高的准确率。结果如下:
- multi-crop方法略微好于dense,VGG论文中没有分析原因,个人理解,就像前面提到的那样,网络中包含很多pooling操作,导致dense的方法实际上每隔很多个像素才会进行crop,反而不如multi-crop采样出的图像更多。
- 可以发现,将这两种方法相结合会在一定程度上提升性能。论文给出的解释是这两种方法有一定的互补性,互补性体现在哪里呢?答案在于它们在卷积层提取特征时padding方式不同:multi-crop每次crop出图像后分别放入网络,故所有crop出的图像在卷积层中的padding方式都是补0 ;而dense则不同,除了在原图像边缘位置之外,其余的都相当于在卷积层padding时补的是它们附近的像素。
4. 多个网络结合
论文还将训练的多个网络模型的结果相结合得到最终的分类结果,显然,这会提升分类的准确率以及稳定性,结果如下: