VGG论文《Very Deep Convolutional Networks For Large Scale Image Recognition》总结

来源:互联网 发布:新知识服务平台的域名 编辑:程序博客网 时间:2024/05/16 18:28

论文中文翻译:http://blog.csdn.net/wangsidadehao/article/details/54311282

一、文章意义

       论文使用的VGG网络在ILSVRC2014图像分类比赛中获得了第二名的成绩,后来的许多网络结构也是在VGG网络的基础上进行改进,取得了很好的效果。论文主要是讨论了卷积神经网络(ConvNet)架构设计的另一个重要方面——深度,通过将深度增加到16-19层,分类效果得到了显著的提升。而且最近在一些比赛群里看大佬用的基本上就是VGG、ResNet和Xception这类的网络模型。

二、网络结构

        网络结构如下图所示:
        
       每个卷基层后面都会跟一个ReLU层,这里为了简明没有标注ReLU层。其中模型D和E是表现最好的两个模型,后面作者融合模型的时候也是用的这两个模型。

三、模型特点

(1)主要是在AlexNet的基础上将网络向更深结构改进(16-19层);
(2)相比与其他一些模型,VGG的第一个卷基层的卷积核大小不大,为3*3,相比于其他一些比如AlexNet(11*11)等;
(3)VGG网络中的convolution filters的大小都是一样的,3*3大小,(C网络是个对比,没有D和E的只用3*3的效果好),像GoogLeNet中就是1*1和5*5的都有;
(4)VGG网络没有采用LRN层,认为这个层对于ImageNet来说没有用,反而会增加计算负担;
     这里说明一下作者为什么要用若干个3*3的卷积层去代替一个较大感受野的卷积核(比如5*5或者7*7)。理论上两个3*3的卷积层与一个5*5的卷积层等价,三个3*3的卷积层与一个7*7的卷积层等价...(算一下就知道了),作者文中认为:
(1)由于每个卷积层后都跟一个ReLU非线性修正层,使得泛化能力更好,对最终的决策函数也更好;
(2)较少了参数的数量;

四、训练过程

       训练过程在前面一些共性的方法上,又细分为单尺度训练和多尺度训练两类。首先先说一下共性的方法(标号不代表操作顺序)。
(1)对训练图像进行减均值操作;
(2)采用mini_batch GD,且是带动量的那种;
(3)batch_size=256, momentum=0.9, L2正则项系数为5*e-4,dropout率为0.5,学习率初始值为0.01,总的iteration为370K, epochs为74个;
(4)在训练更深层网络的时候,先对文中的A网络随机初始化参数进行训练,在用训练好的A网络的前4个卷积层和3个全连接层的参数去初始化深层网络的对应层。深层网络中间的层用均值为0,方差为0.01的高斯初始化,bias初始化为0;
(5)将训练图像缩放到s的大小(s为缩放后的最短边),在缩放后的图像上裁剪224*224的图像块。也就是说“单尺度”和“多尺度”体现在s的不同上,训练图像仍是固定的224*224大小;
(6)对训练图像进行Data Augmentation(数据扩增),采用水平翻转和RGB color shift。

1、单尺度训练

     即s固定。训练若干个不同的S网络,在测试时取softmax的概率平均值。本文用了两个s:256和384。先训练s=256的网络,当训练s=384的网络的时候,用s=256训练好的模型的参数去初始化s=384的各层,并且学习率调整为0.001。

2、多尺度训练

     对每一幅训练图像,从【smin,smax】这个范围随机确定一个s值进行缩放,文中smin=256,smax=512。出于速度考虑,作者在单尺度(s=384)训练好的模型的基础上,用s=384的模型的参数初始化多尺度网络的。作者最后在实验结果中也证明了多尺度训练比单尺度训练得到的错误率要低。

五、测试过程

       测试部分在一些共性的基础上也细分为单尺度测试和多尺度测试。
       共性的部分即testing部分的第一段说的:“Then, the network is applied densely over the rescaled test image in a way similar to (Sermanet et al ,2014)”。即将原来的训练网络进行修改,全连接层换成卷积层(第一个FC层转换成7*7的卷积层,最后2个FC层转换成1*1的卷积层),且将最后一个1*1的卷积层的输出特征图控件平均(sum-pooled)(这里我个人认为是类似于“Network in Network”里的Average Pooling Layer,特征图上所有像素求和平均后得到一个特征点,再输入到softmax分类器里)。同时,对测试集通过水平翻转(没有RGB color shift)扩增,将原始图像和翻转图像的softmax分类概率的平均值作为最终分数。
       重新调整网络结构部分在Caffe里对应的应该是deploy.prototxt的编写。
       不管是单尺度测试还是多尺度测试,测试图像都要先缩放到一个尺寸Q,单尺度测试对一个1个Q,多尺度测试对应3个Q。

1、单尺度测试

     (1)训练集是单尺度

         测试时的Q=S(单尺度训练时的最短边大小)。如文中S=256,Q=256;S=384,Q=384。

     (2)训练集是多尺度

         训练时的S=【Smin, Smax】, Q=0.5(Smin+Smax)。在文中S=【256,512】,Q=0.5(256+512)=384

2、多尺度测试

     (1)训练集是单尺度

         训练集是单一尺寸S时,Q的三个值分别为{S-32,S,S+32}。在文中当S=256时,Q=224,256,288;当S=384时,Q=352,384,416。

     (2)训练集是多尺度

         训练集是多尺度时,即S=【Smin, Smax】时,Q的三个值分别为{Smin,0.5(Smin+Smax),Smax}。在文中,当S=【256,512】时, Q为256,384,512。在后面的实验结果中,作者也证明了多尺度测试比单尺度测试的错误率要低。
       对于单尺度和多尺度测试,都用了水平翻转(没有用RGB color shift)的数据增加。最后在测试时,将原图像和对应的水平翻转图像的softmax分类器的概率求平均值,作为最终的该图像的分数。
       疑问?文章4.3部分Multi-Crop Evaluation中提到的3种评估方法:dense和multi-crop和二者的结合是什么?网上没有找到相关部分的内容,如果知道的同学请赐教!

六、模型融合

      作者文中采用的模型融合方法,即将若干个模型的softmax层的输出概率求平均值作为最终的概率。个人认为这样做会不会粗糙了点?至少也是按模型好坏分配不同权重吧,Boosting和Stacking可以用么?不过实际比赛也好自己仿真也好能训练出一个好的模型就已经不容易了吧。作者这里是融合的D和E两个网络。


七、实验结果

(1)测试集是单一尺度



(2)测试集是多尺度



(3)3种评估方法评估



(4)模型融合的对比结果



(5)与现有(2014)结果的对比




参考博客:
1、http://blog.csdn.net/xjz18298268521/article/details/52381883
2、http://blog.csdn.net/u011576009/article/details/74332108

博客中哪里写的不对的,欢迎批评指正。

阅读全文
0 0