VGGNet论文阅读笔记
VGGNet-Very deep convolutional networks for large-scale image recognition阅读笔记2014
Abstract
文章主要研究了卷积网络的不同深度(depth)设置在大尺度目标识别任务中的效果对比关系。主要的贡献是使用3 * 3的卷积核增加网络的深度(层数),当增加到16-19层,取得了非常好的效果。我们在ImageNet Challenge 2014中取得定位第一名,分类第二名的成绩。我们的表示(representations)在其他的数据集上表现也很好。
1.Introduction
随着大的公共图片数据集,比如ImageNet的出现以及高表现的计算设备比如GPU的出现,卷积网络ConvNets在大尺度的图片识别以及视频识别中取得了很大成功。也有越来越多的人尝试对CNN结构进行优化,以达到更好的分类准确率。比如,在第一层卷积层使用更小的感受野以及更小的步长。再比如,在整个图像和多个尺度上密集地训练和测试网络。在本文中,我们关注CNN的另一个参数-深度(depth),我们将其他参数固定,只通过增加更多的卷积层来增加深度(在所有层均使用3 * 3的小卷积核)。
结果是我们发现了一些更加准确的CNN网络结构,不但可以提升在ILSVRC上的分类和定位任务准确性,对其他数据集也取得了更好的效果,并且可以作为其他pipelines的一部分。
2.ConvNet Configurations
2.1Architecture
训练过程中,我们网络的输入是固定尺寸的224 * 224 的RGB图像,预处理只有对图像的每个像素值,减去RGB通道像素值的平均值(由训练集计算),即数据标准化操作,使得分布接近0。接下来是一系列的卷积层,我们使用3 * 3的感受野(能考虑像素点的上下左右的最小size),在某种配置中,我们甚至采用了1 * 1的卷积核,(可以看做是对输入通道做线性变换)。卷积的步长为1,为了保证卷积之后尺寸分辨率不变,采用padding操作,对3 * 3的卷积,padding = 1。在一些卷积层之后,加入最大池化层 2 * 2 ,步长为2。
卷积层之后是三个FC层,前两个是4096维,最后一层接softmax层,对于1000类分类的ILSVRC,输出为1000维。我们所有的网络中,卷积层层数不同,但FC层的配置是固定的。
所有隐藏层之后接ReLU,我们的所有网络都不包含局部响应归一化(LRN),在第四部分我们将看到,如此归一化不会提升表现,却会增加计算量。
2.2Configurations
所有网络的配置由表1列出,每列一种网络。接下来我们会用A-E指代每种网络。网络的配置均遵从2.1中所说,不同点只在于深度,从A(11层,8+3)到E(19层,16+3),卷积层的卷积核数很小,从64开始,每接一个最大池化,翻倍,直到达到512。
2.3Discussion
我们的网络结构与之前最好表现的网络结构比如AlexNet有很大的不同,AlexNet在第一个卷积层有相对较大的感受野(11 * 11 步长4),我们在整个网络都使用很小的感受野(3 * 3,步长1),连续两层3 * 3的卷积层与一个5 * 5的卷积层的感受野等效。连续三层3 * 3卷积层与一个7 * 7的卷积层的感受野等效。(可以用公式求得。)那么我们使用连续的小卷积核得到了什么呢?以三个3 * 3替代一个7 * 7为例,首先我们使用了3个ReLU而不是1个,使得我们的决策函数更有判别力。第二,我们降低了参数的数量,假设它们的卷积核的通道数一致,均为1,则使用小卷积核的参数量为,而使用大卷积核的参数量为,因此降低了参数数量。
1 * 1的卷积层是一种不影响卷积层的感受野的情况下增加决策函数非线性的一种方式,尽管1 * 1卷积核是在输入输出channels相同情况下的线性投影,它还是添加了一个额外的ReLU来增加非线性。1 * 1层最近被用在“Network in Network”结构(NIN)中。
之前的一些网络也使用了小尺寸卷积核,但是没有在大尺度的ILSVRC数据集应用。GoogLeNet与我们的想法类似,他们层数更深(22层),采用了1 * 1和5 * 5的卷积。它们的网络比我们更复杂,为了减少计算量,在前面几层对特征图的降维比较大。在4.5中我们会将我们的网络与其他网络进行对比。
3.Classification Framework
3.1Training
网络通过使用具有动量的小批量梯度下降来优化多项式逻辑回归目标来进行训练。**batch size设置为256,动量为0.9,使用权值衰减(weight decay)系数,以及对前两个全连接层进行dropout(0.5)来进行正则化。学习率初始设置为0.01,之后每当验证集准确率不再提升,就除以10,一共减小3次,**在370k次迭代(74个epochs)之后,结束训练。相比AlexNet,我们的参数更多,也更深,但是我们比AlexNet收敛更快,我们推测是因为(a)更深卷积层以及更小的卷积核为网络带来了隐藏的正则化(b)对一些层进行了预初始化。
网络权重的初始化很重要,不好的初始化由于深层网络梯度的不稳定会阻碍学习过程。为了规避这个问题,我们先训练A(比较浅,可以使用随机初始化),当训练更深的结构时,我们使用训练好的A的参数来对网络的前四个卷积层和后三个FC层进行初始化,其他的随机初始化(均值0,方差0.01的正态分布,偏置为0)。在论文提交之后我们发现,也可以不用提前训练,使用
Glorot, X. and Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. In Proc.AISTATS, volume 9, pp. 249–256, 2010.
中的方法进行初始化即可。
为了获得固定尺寸224 * 224的网络输入图像,对训练图像进行rescale,然后随机裁剪得到224 *224图像(每次SGD迭代对每张照片裁剪一次)。进一步增强训练集,裁剪块可以进行随机水平翻转以及RGB颜色漂移。(AlexNet中的方法)下面讲解训练图像的rescale:
对训练图像进行缩放(保持比例),得到S,S可以是任何不小于224 * 224的尺寸,然后对这个S图片进行裁剪,S短边 = 224的话,则裁剪下的图像与S宽度一致,S>224的话,裁剪下的图像小于S。
我们考虑两种方法来设置训练尺度S(training scale)。
第一种方法是固定S,这代表着单尺度训练(single-scale training),(注意,裁剪的图像也可以代表多尺度图像统计)。在我们实验中,我们评估在两种尺度上训练的模型,S = 256(大多数其他网络都是)以及S = 384。我们首先使用S=256进行训练,然后使用训练后的模型参数继续训练S = 384,以达到加速效果,同时使用更小的初始化学习率0.001。
**第二种方法是多尺度训练,每一张训练图像被随机rescale S,S有一个范围,通常[256,512]。这是考虑到了不同图像中的目标有不同的尺寸,这个操作也可以看做是训练集的增强。**速度原因,我们微调针对固定S = 384训练的网络参数,进行多尺度模型的训练。
3.2Testing
测试时,给训练好的网络一张图片,进行一下过程。
首先,输入图片被rescale到一个预定义的最小尺度Q(也称为测试尺度),Q不必与训练尺度S相等(在4中我们将介绍,对于每个S,采用几个不同的Q会提升表现。)。
然后,网络densely应用到处理好的test image。流程是:首先将全连接层转换为卷积层(第一个FC变成7 * 7卷积层,后面两个FC变成1 * 1卷积层),转换之后的网络(fully-convolutional net)应用到整张图像上(未裁剪)。结果是一个类别分数图(class score map),其中通道数等于类别数,并且空间分辨率取决于输入图像的大小。
FC层转换为卷积层,第一个转换成7 * 7卷积核,步长为1,通道数4096。与原来的全连接层等价。后续的全连接层可以用1x1卷积等效替代,最后一层1 * 1卷积,通道数1000(类别数)。简而言之, 全连接层转化为卷积层的规则是: 将卷积核大小设置为输入的空间大小。
这样做的好处在于**卷积层对输入大小没有限制, 因此可以高效地对测试图像做滑动窗式的预测。**在训练时,最后一层卷积层输出维度是固定的,打平之后与下一层相连的神经元数量也是固定的,不能对不同尺寸的测试图片进行处理,转换为卷积之后就可以处理了,最后得到的是1000通道的class score map,对每一个通道进行sum-pooling
<img sr
最后,为了获得固定长度向量的class scores,对类别评分图进行sum-pooling操作(每个通道的相加),获得输出向量,维度为类别数。同样适用水平翻转对测试图像进行数据增强,取输出结果的平均值作为结果。
由于是在整张图像进行操作,在测试时就无需进行裁剪。不过,multi-crop由于不同的卷积边界条件,是对dense evaluation的一种补充。当网络应用于一个crop时,卷积边界用0填充,而dense evaluation的时候,边界自然地使用图片的neighbouring部分补充,这就增大了感受野,获得了更多的context。但是我们认为实际中,这种由于多个crop对增加的计算量与潜在的准确率增加不匹配。
3.3Implementation Details
我们实验源自公开C++ Caffe toolbox,做了大量修改,使得我们可以在多个GPU上进行训练和评估工作,同时可以在多个尺度对全尺寸图像进行训练和测试评估。多GPU训练实行数据平行,每个batch数据分成几份送入GPU,计算之后,把结果平均,得到整个batch的梯度。梯度计算在GPU之间同步计算,这样与在一个GPU上运算一样。
4.Calssification Experiments
数据集:在这一部分,我们使用ILSVRC-2012数据集训练我们的网络,展示结果。这个数据集包括1000类图像,训练集(1.3M张),验证集(50K张),测试集(100K张,标签未公开)。网络分类的表现由top-1以及top-5错误率进行评估。
我们的大部分实验使用验证集作为测试集,我们作为“VGG”团队,参与了ILSVRC-2014竞赛,竞赛中网络用在测试集上。
4.1Single Scale Evaluation
首先,我们在单一尺度上评估我们网络的效果。对于测试图像尺寸Q,我们设置为:如果有固定的S(训练阶段设置的S),我们Q = S,如果S在区间之间抖动,我们设置为。结果由下表给出:
分析结果,我们发现,使用了局部响应归一化(LRN)并没有提升效果,因此,我们在更深层的网络均不使用LRN。
我们发现,我们的错误率随着网络深度增加而减小。值得注意的是,尽管深度相同,但是C没有D的效果好,他们之间的区别在于C使用了1 * 1的conv,而D都是 3 * 3的conv。**这表明,1 * 1的conv增加的非线性确实对效果有所提升(C比B效果好),但是使用稍大一些的conv来获取更丰富的空间信息也很重要。**当深度达到19层,我们的错误率接近饱和,但是针对更大型的数据集,更深的网络可能会有效。为了作对比,我们同样针对B网络进行修改,把B中每一对3 * 3conv改成一个5 * 5的conv,这样的结果比原来的top-1错误率提升了7%,这也证明,更深层,小的卷积核,比浅层大的卷积核效果要好。
最后我们发现,尽管测试时只是使用单张图片,训练时使用尺度抖动的模型比训练时固定尺寸得到的模型效果好,这也证实了使用尺度抖动来进行数据增加确实很有效。
4.2Multi-Scale Evaluation
在单一尺寸照片下评价模型之后,我们现在在测试时评估尺度抖动的效果。首先将同一张测试图像根据不同的Q值进行rescale,然后送入模型,最后将结果平均输出。考虑到训练时与测试时的尺度差异会导致效果下降很大。因此对于训练时采用固定尺寸S的模型,测试时使用三种尺寸。同时,在训练时采用尺度抖动使得网络可以在测试时应用于更大尺度范围中,所以采用尺度训练的模型,测试时使用更大的尺寸。
结果由下图给出,结果显示,测试阶段使用尺度抖动相比于只是用一个尺度进行测试,表现有所提升。越深层的网络表现得越好,训练时使用尺度抖动的网络表现比训练时使用固定S的网络效果好。
4.3Multi-Crop Evaluation
下表中我们对比了dense evaluation以及multi-crop(多个crop输出取平均)的效果。同时我们也将这两种方法进行组合,评估效果。可以看出,使用multi-crop比dense evaluation好一点点,两种方法组合也确实取得了更好的效果,但是计算量增加较多。
4.4ConvNet Fusion
在这部分实验中,我们将几个模型的输出进行组合(平均它们的softmax输出),由于不同模型之间的互补性,提升了性能。
结果由下表给出,在ILSVRC提交之前,我们只训练了单尺度的网络,和多尺度的D模型(仅仅对FC层进行了微调)。7种网络的组合在ILSVRC有7.3%的测试错误率。在提交后,我们仅仅将多尺度模型D和E进行组合,就将测试错误率降低到7.0%(使用dense evaluation)和6.8%(使用dense+multi crop),作为参考我们的单个模型最好的效果是7.1%错误率(上图E)。
4.5Comparison With the state-of-art
最后,我们与当前主流结果进行对比,如表七所示。在ILSVRC-2014挑战的分类任务中,我们使用7种model融合7.3%错误率,取得了第二名。提交之后,我们又使用多尺度D+E融合,降到了6.8%。
表七中可以看出,我们的网络极大超越了在ILSVRC-2012和2013中取得最好效果的之前的模型。相比于分类冠军(GoogLeNet,6.7%错误率),我们的结果也很有竞争力。相比于其他,我们最好表现的网络仅由两个网络组合取得,比大多数的ILSVRC提交都少;在单个网络表现中,我们的网络取得了最好效果(7.0%),比单个的GoogLeNet少0.9%。值得注意的是,我们没有脱离经典的CNN结构,只是通过增加深度来取得更好效果。
5.Conclusion
本文评估了VGG(最多19层),证实增加层数对提升分类准确性有效。
在附录中,我们将展示我们的模型可以在一系列任务和数据集中取得很好的效果,可以取得匹配或者超过更复杂的一些pipelines(层数不够深)的效果,这些结果更加证实深度的重要性。
A.Localisation
在这部分,我们转向挑战的定位任务,我们以25.3%的错误率赢得了2014的比赛。定位可以视作目标检测的一种特殊形式,可以看做为top-5classes中每一类都预测一个bounding box,而不管这类目标的实际数量有多少,我们采用Overfeat中的方法,做了一些修改。
A.1Localisation Convnet
针对目标定位任务,我们将最后的FC层更改,从预测class score改为预测bbox的位置。每个bounding box由一个四维向量表示,存储中心坐标,宽度和高度。可以选择这些bbox预测结果是否对所有的class共享,(single-class regression SCR)或者(per-class regression,PCR)。若选择前者,最后一层输出为4维(只有一个bbox),若选择后者,最后输出4000维(因为数据集有1000类)。除了最后一层,前面我们选用在分类任务中表现最好的D模型。
**Training:**定位与分类训练的主要不同在于,我们使用欧式loss替代了原来的loss,这会更好地惩罚预测的bbox参数与ground-truth的差异。我们训练了两个定位模型,每个都是单尺度的:$S=256 $和 ,(由于时间原因,我们ILSVRC-2014提交中,没有使用尺寸抖动进行训练)。初始化使用对应的分类模型的参数,初始学习率设为,我们对卷积层和前两个FC层使用了微调(与Overfeat中一致),最后一个FC层随机初始化,从头开始学习。
**Testing:**我们考虑两种方式。
第一种是用来在验证集上比较不同的网络修改效果,只考虑网络对ground truth类的bbox预测(来排除分类错误导致的定位错误),网络仅仅对图像的central crop进行处理,预测bbox。
第二种的测试流程与3.2中分类任务类似,**基于对整张图像进行dense application。与分类的不同在于:分类生成class score map,而定位任务最后一层的输出是一系列bbox预测结果。**为了得到最终结果,**我们使用Overfeat中的贪婪融合流程,首先合并空间上相近的预测结果(对它们的坐标进行平均),之后基于class scores(由分类网络得到的)进行评分选出结果。**当使用多个定位网络时,我们把这些预测结果统一到一起,再进行合并操作(相比分类时,是每个网络的输出再平均)。
A.2Localisation Experiments
我们首先通过第一种流程找到最好的网络,之后使用第二种流程进行测试。当预测的bbox与ground truth的IoU大于0.5,则认为定位成功。
Setting comparison:由下表给出,我们的结果是PCR比SCR效果好,这与Overfeat中的结果不同。同样我们注意到,对所有层都进行fine-tuning比只对FC层效果好。图中实验中S = 384,S=256的结果类似,省略了没有给出。
**Fully-fledged evaluation:**我们把上面得到的最好模型(PCR,对所有层fine-tune),应用到第二种测试流程上,**其中top-5 class labels由我们最好的分类网络预测出,然后使用dense application,将bbox预测结果合并。**如下表所示,将整张图像进行处理,比只对central crop进行处理效果好,与分类任务一样,使用多个尺度以及多个网络结果进行组合提升了网络效果。
**Comparison with the-state-of-art:**如下表所示,我们与其他网络比较定位结果。我们取得25.3%的错误率,赢得了ILSVRC的分类任务,且效果好于2013的冠军Overfeat。