Backbone-VGG[ICLR2015] Very Deep Convolutional Networks for Large-Scale Image Recognition

最近决定精度一下经典CNN网络,很多都是一直用封装的又比较好所以泛读的较多。这是第一篇大名鼎鼎的VGG

论文连接:https://arxiv.org/abs/1409.1556

摘要

主要贡献:使用(3*3)小卷积核,对网络深度的增加进行全面评估,增加网络层数到16或19层,网络表现出了一个显著的效果提升。在ImageNet2014挑战中,检测和分类任务中各自取得了第一和第二的成绩。

1 引言

近来卷积网络已经在大规模图片和视频识别方向上取得了很大的成功,高性能的计算体系,如GPU或大规模分布式的使用。基于ImageNet的大规模视觉识别竞赛在深度视觉识别领域中成为了一个重要的角色,它为使用深度网络提取高维隐藏特征进行大规模图像分类的模型提供了一个可靠的测试集。

在卷积网络在计算机视觉领域成为一种通用结构时,大量的研究致力于微调AlexNet的结构来提升准确率。在本文中,我们着重于另一个卷积网络架构设计中的要点—深度。我们固定了网络架构中的其他参数,通过增加卷积层来平稳的增加网络深度。由于小卷积核(3*3)的使用,这种方法(不断增加网络深度)得以实现。

2 网络配置

2.1 Architecture

(1)训练网络时,输入的图像大小是224*224的(测试时则不一定,原因后面会讲到),唯一的预处理步骤是减去均值。
(2)所有卷积层均使用3*3的卷积核(对比实验中用到了1*1的卷积核,它的作用在于引入更多的非线性。最终的VGG16和VGG19都不包含1*1的卷积核,所以它的出现只是为了做对比实验,后面部分会提到)。
(3)为了使卷积后的feature map大小和卷积前相等,卷积核为3*3的卷积层的padding都设置为1。
(4)使用max pooling,但并不是所有的卷积层后面都跟着pooling层,一共只有5个max pooling层。kernel大小是2*2,步长为2,也就是说,和AlexNet不同,VGGNet使用的是不重叠的pooling。
(5)所有网络模型的最后三层都是全连接层。其中前两层都有4096个神经元,最后一层则是1000,每个代表一个分类类别。
(6)所有的隐含层的激活函数都是ReLU函数,最后一层则是softmax层。
(7)没有使用AlexNet中的LRN技术。这是因为后面的实验中证明了使用LRN对性能没有提升作用而且增加内存消耗

3.2 Configurations

为评估网络深度对性能的影响,文中设计了多种不同深度的网络结构。最浅层的有11层,最深有19层,所有网络模型最后三层均为全连接,其余是卷积层。如下图

2.3 Discussion

(1)为什么使用3*3的卷积核?

3*3是能抓取局部信息的最小的尺寸。不难得到,两层3*3的卷积层便可以得到5*5的感受野,相当于一层5*5的卷积层。以此类推,三层3*3的卷积层相当于一层7*7的卷积层。那么为什么不直接使用大的卷积核,而是使用多层3*3的卷积层来起到类似的作用呢?原因主要有两点:

  • 层数越多,非线性因素就越多,决策函数的判别力更强。
  • 虽然使用小的卷积核时,需要的层数会更多,但是需要学习的参数反而更少了,可以将层数更多、卷积核更小看作是对大的卷积核强加了正则化。

(2)1*1卷积核的作用?

在不影响卷积层的感受野的情况下,为模型引入更多的非线性。不影响感受野是显而易见的,非线性是怎么来的呢?是由于非线性激活函数的使用。

3 训练和测试

3.1 训练

(1)batch size为256,momentum设置为0.9,权重衰减系数为0.0005。
(2)前两层全连接层使用Dropout,Dropout比例为0.5。
(3)学习率初始时为0.01,当验证集的准确率停止提高时,学习率除以10。
(4)虽然和AlexNet相比,VGGNet的参数更多、深度更深,但是却收敛的更快。原因有两点,一是前面提到的更深的层和更小的卷积核相当于隐式的进行了正则化;二是在训练期间对某些层进行了预初始化
(5)训练一个浅层的网络结构A(网络结构见上图),训练这个浅层的网络时,随机初始化它的权重就足够得到比较好的结果。当训练深层的网络时,前四层卷积层和最后的三个全连接层使用的是学习好的A网络的权重来进行初始化,而其余层则随机初始化。这也就是上一点提到的某些层的预初始化。(随机初始化权重时,使用的是0均值,方差0.01的正态分布;偏置则都初始化为0)。
(6)图像各向同性的缩放,使得最短边缩放至S(S大于等于224),由于要求输入是224*224大小的,所以再对缩放后的图像进行crop。至于S的取值,论文提出了两种不同的方法:

  • 固定的尺度,对所有的图片,S都是固定的同样的值。论文考察了S=256和S=384两种情况下分别训练得到的网络的性能。为了加速,训练S=384的网络时,使用训练好的S=256的网络来初始化权重,并且学习率更小,为0.001。
  • 可变的尺度,设置一个范围[Smin,Smax],每一张图片都从这个范围内随机选取一个数作为它的S。论文中使用的范围是[256,512]。这使得训练在一个很大范围的图像尺度之上进行。为了加速,通过微调S=384的固定尺度的网络来训练得到可变尺度的网络。

3.2 测试

使用两种不同的方式进行分类:dense evaluationmulti-crop evaluation,这两种方式分别借鉴于Overfeat和GoogLeNet。

(1)dense evaluation

就是利用卷积层来代替全连接层,来实现在缩放后的图像上密集crop的效果。经过所有的卷积层之后,得到的是m*m的C个通道的feature map,接着可以将f1层看作是卷积核大小为m*m,通道数为n1的卷积层,得到的输出是1*1*n1的(无padding),效果和全连接层一样。然后,再将f2层看作是卷积核大小为1*1,通道数为n2的卷积层;将f3层看作是卷积核大小为1*1,通道数为n3的卷积层。

  • 为什么能起到密集crop的效果?

假设训练时网络接受的图像大小是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

对图像进行多样本的随机裁剪。对三个尺度上每个尺度进行50次裁剪(5x5大小的正常网格,并进行两次翻转)即总共150次裁剪的效果图,然后通过网络预测每一个样本的结构,最终对所有结果平均。
 

4 实验

。。。。。

猜你喜欢

转载自blog.csdn.net/Bolly_He/article/details/123922641