Very deep convolutional networks for large-scale image recognition - 论文笔记

原文地址:Very deep convolutional networks for large-scale image recognition
VggNet在ILSVRC-2014上分别获得定位和分类项目中第一名和第二名的成绩,其主要采用3x3的小卷积并将模型深度增加到16-19层。

1 介绍

卷积网络(ConvNets)最近(2014)在大规模的图像和视频识别中获得了很大的成功,这可能由于大型公共图像库(如 ImageNet)以及高性能计算系统(如GPU或大规模分布式集群)。特别是在深度视觉识别结构发展中扮演了重要角色的ImageNet大规模视觉识别大赛(ImageNet Large-ScaleVisual Recognition Challenge, ILSVRC)为从高维浅层特征编码 (ILSVRC-2011冠军)到深度卷积网络(ILSVRC-2012冠军)的几代大规模图像分类系统提供了测试平台。

随着卷积网络在计算机视觉领域的应用越来越广泛,为了获得更高的准确率,越来越多的人尝试在Krizhevsky et al. (2012)中的原始框架上进行改进。例如,ILSVRC-2013最好的参赛模型在第一个卷积层上使用了较小的接受域窗口(smaller receptive window size)以及较小的滑动步长。另一种改进方案是在整张图像及其多个尺度上稠密的训练和测试网络。本文中,我们关注了卷积网络结构设计中的另一个重要因素——深度。为此,我们固定了网络框架的其他参数,然后逐步通过增加更多的卷积层来增加网络的深度。由于我们在所有层都是用非常小(3×3)的卷积滤波器,因此这是可行的方法。

2 卷积网络设置

作者为了在公平的环境下衡量由增加的卷积层深度所带来的效果,所有的卷积层都用相同的原则来设计。

2.1 结构

在训练阶段,采用224x224的固定大小RGB图像做输入,唯一的预处理操作就是计算出整个训练集的每个像素RGB均值。(此处预处理和ALexNet相同)。

输入图像被送进使用3x3小卷积的卷积层栈中。在某一个网络设置中,作者也使用了1x1的卷积核,1x1的卷积核可以看作是对输入通道做了一个线性变换(之后接一个非线性操作)。所有卷积都使用1像素步长,同时对输入做相应的padding操作以保持经过卷积后的输出图像空间分辨率(图像长/宽)不变,比如对于3x3的卷积层就要在图像四周做1像素的padding。空间池化包含5个最大池化层,这些池化层在某一些卷积层后(而不是所有)。最大池化采用步长为2的2x2大小窗口。

卷积层栈之后有3个全连接(FC)层:前两层各有4096个通道,第三层用于做1000类的ILSVRC分类因而有1000个通道。最后一层是softmax层。全连接层的设置在作者的所有网络中都相同。

所有的隐藏层都进行ReLU操作。同时我们所有网络中只有一个使用了LRN(LRN参数和ALexNet中相同),因为作者发现LRN并不会提高在ILSVRC上的准确度但会增加内存消耗和计算时间。

2.2 配置

这篇文章所评估的卷积网络配置如下:
nets.png
所有的网络都采用2.1中描述的设计,它们之间只有深度上的差异。卷积层的通道数从64开始每次经过最大池化层后x2直到512.

各网络的参数数量如下:
params.png
尽管网络很深,但是权重的数量并不比一个网络更浅但是卷积核尺寸更大的模型多。

2.3 讨论

VGG使用了更小的(3x3,步长为1)的卷积核,不同于前两年的ILSVRC的优胜者(2012-AlexNet: 11x11步长4, 2013; 2013-ZFNet: 7x7步长2)。显然,两个连续3x3卷积相当于一个5x5的卷积,而三个3x3的卷积则相当于7x7的卷积.

使用3x3小卷积的好处有两个,以用3个3x3卷积替代一个7x7卷积为例:

  1. 3个卷积层就可以做3次ReLU等非线性操作而不是1次,这使模型Capacity增加了。
  2. 多个小卷积叠加带来的是更少的参数量,如果每个卷积层输入输出都有C个通道,则3个3x3卷积层权重数为3(3^2C^2)=27C^2,而单一的7x7卷积层权重数为77C^2=49*C^2

另外作者还考虑到了1×1的卷积,尽管(输出和输出的通道数量相同的)1x1卷积层本质上相当于到相同维度空间的一个线性投影,但是激活函数使整个模型非线性增加。1×1卷积层最近(2014)被使用在的Network in Network结构中。

小尺寸的卷积滤之前在Flexible, High Performance Convolutional Neural Networks for Image Classification(2011)中使用过,但是他们的网络远没有VGGNet的深。

3 分类框架

3.1 训练

VGGNet使用的训练方法基本延续AlexNet的方法(除了从多尺度图像中裁切,后文会有解释):
使用带有动量(momentum=0.9)的mini-batch(batch_size=256)梯度下降法(基于反向传播, LeCun et al, 1989)来优化多项式回归(the multinomial logistic regression)。通过权值衰减(L2惩罚系数设置为5*10^−4)以及对前两个全连接层执行dropout(dropout=0.5)来对训练进行正则化。初始学习率设置为10^−2,当验证集准确率稳定时将学习率除以10。学习率总共降低了3次,训练一共进行了370K次迭代(74个epoch)。相比AlexNet约90epochs有所减少,由于:1) 更深的深度和更小的卷积滤波器尺寸隐式的增强了正则化;2) 某些层执行了预初始化(pre-initialisation)。

网络权重的初始化是非常重要的,由于深度网络梯度的不稳定性,不合适的初始化将会阻碍网络的学习。为了避免这个问题,我们先在网络A上使用随机初始化进行训练。然后在训练更深的网络时,我们使用网络A来初始化前四个卷积层和最后三个全连接层(中间层使用随机初始化)。同时作者并没有降低预初始化层的学习率。采用随机初始化的层则从均值0方差0.01的正态分布中对权重进行采样,bias初始化为0。作者在文章提交后发现可以使用Understanding the difficulty of training deep feedforward neural networks中的随机初始化程序来对权重进初始化而不需要进行预训练。

训练图像大小

作者在模型训练时,使用了Multi-scale的训练:把原始图像缩放到最小边S不小于224,然后在整幅图像上提取224*224片段来进行训练。两种方案:
方案1:所有图像上固定S,分别设置S=256,和S=384,然后进行裁切来训练两个模型,使用两种模型来评估。
方案2:对于每一幅图像,在[Smin,Smax]中随机选取一个S,然后在进行裁切来训练模型,这种训练方式相当于使用了尺寸抖动(scale jittering)的数据增强,可以使用一个单一的模型来对多尺寸图像进行识别。

3.2 测试

测试阶段,图像缩放到一个尺寸Q(Q与训练尺寸S并不一定要相同)。然后根据OverFeat中方法,将网络转换为全卷积网络(FCN):第一个全连接层转换成7×7的卷积层,后两个全连接层转换成1×1的卷积层。再将此网络上计算缩放后但未经裁切的图片的分类得分,计算原始图像和翻转图像上得分平均值作为最终得分。[这部分可以参考: http://www.jianshu.com/p/6d441e208547]

作者还发现在测试时使用多种尺寸缩放图像并进行裁剪再结合上述方法可以进一步提高准确率,并给出了实验结果(4.3)。

3.3 实现细节

VGGNet基于Caffe实现但对其进行了修改,以满足多GPU训练和评估的需要。

训练时,将每批数据分给多个GPU并行计算,最后计算所有GPU的梯度平均值作为最后此批数据总梯度。因为梯度计算在GPU间同步所以多GPU训练和单GPU训练结果相同。

训练时间:4块NVIDIA Titan Black(是单卡的3.75倍)训练2-3周

4 分类实验

4.1 单一尺寸(SINGLE SCALE EVALUATION)

single-scale.png

4.2 多尺寸(MULTI-SCALE EVALUATION)

multi-scale.png

4.3 多尺寸+裁剪(MULTI-CROP EVALUATION)

multi-crop.png

4.4 多卷积网络融合

net-fusion.png