精读《Very Deep Convolutional Networks For Large-Scale Image Recognition》

精读《Very Deep Convolutional Networks For Large-Scale Image Recognition》

论文原地址:Visual Geometry Group - University of Oxford

\quad \quad VGG的研究背景)卷积神经网络已经成为计算机视觉领域的常用工具,所以有很多人尝试改善2012年提出的AlexNet来实现更好的效果。比如,在ILSVRC中-2013中表现最好的ZFNet在第一卷积层使用更小的卷积(receptive window size)和更小的步长(stride)。另一种策略是多尺度地在整张图像上密集训练和测试。VGGNet则强调了卷积神经网络设计中另一个重要方面—深度。

一、前期知识储备

1.1 稠密评估( dense evaluation )

\quad \quad 知识链接:https://www.zhihu.com/question/270988169/answer/365251328

\quad \quad 3.2 testing中作者提出了一种策略,即使用卷积层代替全连接层(具体理解可参考FCN网络,讲的十分详细),这种策略不限制输入图片的大小,最终输出结果是一个 w ∗ h ∗ n w*h*n whnscore map。其中, w w w h h h与输入图片大小有关,而n与所需类别数相同。而将 w ∗ h w*h wh个值进行sum pool(对每一个channel进行求和),即可得到在某一类上的概率。这种方法叫做dense evaluation另一种策略就是经常使用的卷积层+全连接层。通过将测试图片缩放到不同大小Q,Q可以不等于S(训练时图片大小)。在 Q ∗ Q Q*Q QQ图片上裁剪出多个 S ∗ S S*S SS的图像块,将这些图像块进行测试,得到多个 1 ∗ n 1*n 1n维的向量。通过对这些向量每一维求平均,得到在某一类上的概率。这种方法叫做multi-crop。作者认为,这两种方法的差别在于convolution boundary condition不同:dense由于不限制图片大小,可以利用像素点及其周围像素的信息(来自于卷积和池化),包含了一些上下文信息,增大了感受野,因此提高分类的准确度;而multi-crop由于从图片上裁剪再输网络,需要对图像进行padding,因此增加了噪声。但是由于multi-crop需要裁剪出大量图片,每张图片都要单独计算,增加了计算量,并且准确率提升不大。在论文4.3中可以看出multi-crop比dense在top-1错误率上提升只有0.2。

1.2 全局平均池化(Global Average Pooling)

\quad \quad 论文的附录 **B《GENERALISATION OF VERY DEEP FEATURES》**提到使用全局平均池化(GAP)。

\quad \quad GAP其实指的是在池化操作中感受野的大小与整个 feature map 的大小一样,这样一整张feature map 只产生一个值。比如一个 4×4 的 feature map 使用传统的池化方法( 2 × 2 2×2 2×2),那么最终产生的 feature map 大小为 2×2 ,如下图(以全局最大池化为例):

\quad \quad 如果采用全局池化,则感受野大小为( 4 × 4 4×4 4×4),那么最终产生一个值( 1 × 1 1×1 1×1),如下图:

\quad \quad GAP和上图的Global Max Pooling同理,只不过每个感受野的计算方式为求平均值(average),如果前一层有多个feature map 的话,只需要把经过GPA的结果堆叠起来即可,从而可以总结出,如果输入 feature map 为 W × H × C W×H×C W×H×C,那么经过GAP之后的输出就为 1 × 1 × C 1×1×C 1×1×C。如下图:

1.3 pre-train

\quad \quad VGGNet 6组实验中的后面几组中用到了pre-train后的A模型的部分层作为网络初始化的参数。下图可以看出三种针对不同数据量级而选择的训练策略。Alex讲到,对于在ImageNet上训练过的pre-trained model,其参数可以用来初始化别的任务:

  • 数据量小的新任务。可以把前面的大部分层参数冻结(freeze),保留前面的卷积层和部分卷积层,以获取在ImageNet上得到的提取特征的能力,作为特征提取器,而只训练最后一层的全连接层。

  • 数据量中等的新任务。则需要更多的可变的层来拟合新任务的数据,freeze前面的层,留出更多的层去拟合新数据。

二、论文精读

2.1 VGG的表现

\quad \quad VGGNet由牛津大学的视觉几何组(Visual Geometry Group)提出,它的主要贡献是使用非常小的**( 3 × 3 3×3 3×3)卷积滤波器架构对网络深度的增加进行了全面评估,这表明通过将深度推到16-19加权层可以实现对现有技术配置的显著改进**。这些发现让VGG团队在ILSVRC-2014的**定位任务(localisation)**取得第一、**分类任务(classification)**取得第二(第一名是GoogLeNet)。并且作者还表明其提出的ConvNet对于其他数据集泛化的很好,在其它数据集上也取得了最好的结果。

2.2 VGG的特点

  • 卷积核变小。作者做的6组实验中,卷积核全部替换为3×3(极少用了1×1),选用更小卷积核的motivation是作者受到这两篇文章(Zeiler & Fergus, 2013; Sermanet et al., 2014)启发,使用更小的卷积核尺寸和stride得到性能提升,并表明前两篇文章虽然提出了使用更小的卷积核但是网络结构不深且没有在ImageNet数据集上进行验证;

  • ==层数更深更宽(==11-19层)。作者的实验发现层数越深,带来的分类结果也越好,但并没有提到channel变宽这一个因素:6组实验中channel数都是逐层加宽的,如果单说深度对性能的影响而忽略宽度(这里宽度不是feature map的width而是depth),我觉得并不够convincing,应该再加入一下对宽度(channel)数分析对比的实验;

  • 池化核变小且为偶数。AlexNet中的max-pool全是的3×3,但VGGNet中都是2×2的。作者没有说明选择这种size的考量(现在stride=2、以及2×2和3×3的pooling kernel选择的主流),可能是因为2×2能够在下采样的过程中减少特征信息的丢失,相比3×3更容易捕获细小的特征变化起伏,此外或许是发现2×2的实验效果确实比3×3的好吧(毕竟这也是直接原因);

  • 网络测试阶段将训练阶段的三个全连接替换为三个卷积。对于训练和测试一样的输入维度下,网络参数量没有变化,计算量也没有变化,思想来自OverFeat,1×1的卷积思想则来自NIN。优点在于全卷积网络可以接收任意尺度的输入(这个任意也是有前提的,长和宽都要满足: a × 2 n a\times2^n a×2n,n是卷积与池化做stride=2的下采样的次数);

  • 多尺度训练及预测

  • 适用于多种计算机视觉任务

2.3 网络结构和配置

  • 图片输入的尺寸固定,均为224 x 224
  • 图片的预处理方式和AlexNet一样:每个像素值减去整个训练集对应位置的RGB均值,除此之外没有其它预处理方式;
  • 仅使用小卷积核3 x 3和1 x 1,步长均为1,3 x 3的padding = 1;
  • Max pooling窗口均为2 x 2,步长2(不使用AlexNet的重叠池化了);
  • 所有卷积层和FC层之后都有ReLU;
  • 除上图中的A-LRN网络之外其它模型(A\B\C\D\E)没有使用LRN(因为经过实验发现加入了LRN没有效果,同时又费时费空间)。

\quad \quad 上图是作者作六组实验所用的模型,分别用来观察深度LRNconv1x1的小卷积这三个因素对结果的影响(统计网络层数是只统计卷积层和全连接层)。所有实验中的网络结构除了层数大体相同,均是五组卷积(每一组可能有多个卷积层,A网络包含8个卷积,E网络包含16个卷积),再接三个全连接层。网络得到的feature map从64开始随卷积组数的推进逐渐递增,每经过一次池化操作扩大一倍,扩大直到达到512的channel数。因为小卷积核的缘故,网络即使很深也不会带来过大的参数量(见下图Table2)。

2.4 训练和评估细节

\quad \quad ConvNet训练过程通常遵循AlexNet(除了独创的多尺度训练)。也就是说,通过使用具有动量的小批量梯度下降(基于反向传播)优化多项式逻辑回归目标函数来进行训练。批量大小(batch size )设为256,动量(momentum)为0.9。训练通过权重衰减(L2惩罚乘子设定为 5 ⋅ 1 0 − 4 5⋅10^{-4} 5104)进行正则化,前两个全连接层执行Droupout正则化(丢弃率设定为0.5)。学习率初始设定为0.01,然后当验证集准确率停止改善时,减少10倍。学习率总共降低3次,学习在37万次迭代后停止(74个epochs)。作者表明尽管与AlexNet相比VGG网络参数更多,网络的深度更大,但网络需要更小的epoch就可以收敛,这是由于(a)由更大的深度和更小的卷积滤波器尺寸引起的隐式正则化;(b)某些层的预初始化。

\quad \quad 网络初始化:为规避深度网络梯度不稳定所造成的不好的初始化可能会阻碍学习的问题,先随机初始化足够浅的网络A(表1,这里和下面的随机初始化的权重都服从均值为0,方差为0.01的正态分布中采样),当训练更深网络时,前四个卷积层和后三个FC层直接用A的权重,中间的卷积层仍随机初始化,bias均为0(fine-tuning,LR并不区分对待,所有层相同)。

训练尺度设置:本文考虑了两种方法来设置训练尺度(AlexNet仅有一种缩放尺度:256 x 256)

TIPS:下面设缩放后图片短边为S,放缩后每个SGD的迭代都会对其随机裁剪出224 x 224,裁剪后再利用水平翻转和RGB颜色偏移进行数据增强(和AlexNet一样),然后再喂入网络中(注意网络的输入为224 x 224)

  • 设置S的第一种方法固定尺度 S = 256或S = 384(由于训练时间过久,作者在训练S = 384时用了S = 256的预训练模型,同时用了0.001更小的LR);
  • 设置S的第二种方法是多尺度训练 考虑到图像中的目标可能有不同的大小,每张训练图片的S从区间[256, 512]随机选择,通过尺度抖动进行训练集增强,单个模型被训练在一定尺度范围内识别对象(多尺度又fine-tuning了S = 384网络的所有卷积层和FC层,毕竟当时训练一次要两三个星期)。

2.5 测试

第一种方法(全卷积):

\quad \quad 作者在测试阶段把网络中原本的三个FC层依次变为 1 个conv7x7层,2 个 conv1x1层,也就是三个卷积层,形成全卷积网络。改变之后,整个网络由于没有了全连接层,网络中间的feature map不会固定,所以网络对任意大小的输入都可以处理。

\quad \quad 下图是VGG网络最后三层的替换过程,上半部分是train阶段,此时最后三层都是FC层(输出分别是4096、4096、1000),下半部分是test阶段(输出分别是1x1x4096、1x1x4096、1x1x1000),最后三层都是conv。下面是详细的转换过程(以下过程都没有考虑bias,略了):

\quad \quad 训练阶段:有 4096 个输出的全连接层FC6的输入是一个 7x7x512 的feature map,因为全连接层的缘故,不需要考虑局部性, 可以把 7x7x512 看成一个整体,25508(=7x7x512)个输入的每个元素都会与输出的每个元素(或者说是神经元)产生连接,所以每个输入都会有 4096 个系数对应4096个输出,所以网络的参数(也就是两层之间连线的个数,也就是每个输入元素的系数个数)规模就是 7x7x512x4096。对于FC7,输入是4096个,输出是4096个,因为每个输入都会和输出相连,即每个输出都有4096条连线(系数),那么4096个输入总共有4096×4096条连线(系数),最后一个FC8计算方式一样,输入是4096个,输出是1000个,那么4096个输入总共有4096×1000条连线(系数)。

\quad \quad 测试阶段:由于换成了卷积,第一个卷积后要得到 4096(或者说是1x1x4096)的输出,那么就要对输入的 7x7x512的feature map的宽高(即width、height维度)进行降维,同时对深度(即Channel/depth维度)进行升维。要把 7×7 降维到1×1,那么干脆直接一点,就用 7×7 的卷积核就行(卷积核尺寸7×7×512,卷积核个数4096个),另外深度层级的升维,因为 7×7 的卷积把宽高降到 1×1,那么刚好就升高到4096就好了,最后得到了 1x1x4096 的feature map。这其中卷积的参数量上,把 7x7x512 看做一组卷积参数,因为该层的输出是4096,那么相当于要有4096组这样 7x7x512 的卷积参数,那么总共的卷积参数量就是:[7x7x512]x4096,这里将 7x7x512 用中括号括起来,目的是把这看成是一组,就不会懵。

\quad \quad 第二个卷积依旧得到 1x1x4096 的输出,因为输入也是 1x1x4096,三个维度(宽、高、深)都没变化,可以很快计算出这层的卷积的卷积核大小也是1×1,而且,通道数也是4096,因为对于输入来说,1x1x4096 是一组卷积参数,即一个完整的 filter,那么考虑所有4096个输出的情况下,卷积参数的规模就是 [1x1x4096]x4096(4096个卷积核)。第三个卷积的计算一样,略。

第二种方法(裁剪):

\quad \quad 还是AlexNet的思路,作者每个尺度裁剪50张图片,三个尺度一共150张图片(这里还是需要裁剪出224 x 224的)。

实现:C++ Caffe toolbox;四块NVIDIA Titan Black GPUs,一个batch多GPU计算,然后将结果综合起来。

2.6 分类实验

\quad \quad 12年到14年的挑战赛都使用的是 1000 个类别的ILSVRC-2012数据集(Large Scale Visual Recognition Challenge),其中:

  • 训练集:130万张图片;
  • 验证集:5万张图片;
  • 测试集:10万张图片,这组数据的label没有给出(with held-out class labels)。

\quad \quad 两个性能评估准则:top-1top-5 error。前一个是多类分类错误率,错分的图像的比率。后一个是ILSVRC中主要的评估指标,计算的是预测出来的top5的类别里没有ground truth的比率,即top-5 error。

\quad \quad 这里作者使用两种方式来评估模型在测试集(实际的验证集)的性能表现:**单尺度评估(single scale evaluation )**和 多尺度评估(multi-scale evaluation)

2.6.1 单尺度评估

\quad \quad 对每个网络(A\A-LRN\B\C\D\E,总共6个)进行单尺度评估,测试图像尺寸 Q Q Q依训练时 S S S的尺寸 S S S设定分 S S S为两种情况:

  1. 训练图像的尺寸 S S S固定时,设置训练图像尺寸S等于测试图像尺寸 Q Q Q
  2. 训练图像尺寸== S S S是介于 [ S m i n , S m a x ] [Smin,Smax] [Smin,Smax]时==,设置测试图像尺寸 Q = 0.5 ( S m i n + S m a x ) Q=0.5(Smin+Smax) Q=0.5(Smin+Smax)。实验结果如下表:

实验结论:

  1. LRN层无性能增益(A和A-LRN对比)。作者通过网络A和A-LRN发现AlexNet曾经用到的LRN层(local response normalization,LRN是一种跨通道去normalize像素值的方法)没有性能提升,而且还浪费了空间和算力,因此在后面的4组网络中均没再出现LRN层

  2. 深度增加,分类性能提高(A、B、C、D、E对比)。从11层的A到19层的E,网络深度增加对top1和top5的error下降很明显,所以作者得出这个结论。

    思考:虽然A—D网络深度在变深,同时宽度(通道)也在增加,improve of performence是否和宽度也有关系?

  3. conv1x1的非线性变化有作用(C和D对比)。C和D网络层数相同,但D将C的3个conv3x3换成了conv1x1,性能提升,具体分析见后面总结。

  4. 多小卷积核比单大卷积核性能好(B)。作者做了实验用B和自己一个不在实验组里的较浅网络比较,较浅网络用conv5x5来代替B的两个conv3x3。多个小卷积核比单大卷积核效果好。


  5. 训练时的尺度抖动(scale jittering)( S ∈ [ 256 ; 512 ] S∈[256;512] S[256;512])得到了与固定最小边( S = 256 S=256 S=256 S = 384 S=384 S=384)的图像训练相比更好的结果,即使在测试时使用单尺度。这证实了通过尺度抖动进行的训练集增强确实有助于捕获多尺度图像统计

2.6.2 多尺度评估

\quad \quad 也就是对输入图像在一定范围内进行尺度随机缩放,模型最终的结果,是基于不同尺度(对应多个不同值的Q)且是crop后的图像跑网络得到的softmax结果的平均

  • 用固定大小的尺度 S S S训练的模型,用三种尺寸 Q Q Q去评估,其中 Q = [ S – 32 , S , S + 32 ] Q=[S–32,S,S+32] Q=[S32,S,S+32]
  • 用尺度 S S S随机的方式训练模型, S ∈ [ S m i n ; S m a x ] S∈[Smin;Smax] S[Smin;Smax],评估使用更大的尺寸范围 Q = [ S m i n , 0.5 ( S m i n + S m a x ) , S m a x ] Q=[Smin,0.5(Smin+Smax),Smax] Q=[Smin,0.5(Smin+Smax),Smax]。实验结果如下:

实验结论:

\quad \quad 随机尺度训练的模型效果更好。C、D、E这三组有随机尺度训练,发现效果比固定尺度训练的模型带来的性能更好。

也很有可能是尺寸大带来的结果,因为固定尺寸的最大尺寸(384)比随机尺寸的最大尺寸(512)要小很多。当然,仍旧是深度随着递增越来越深(C、D、E,也要考虑宽度)的网络性能越好。

2.6.3 多裁剪图像(crop)评估

\quad \quad 作者比较了dense ConvNet evaluation 和 multi-crop evaluation。发现multi-crop比dense ConvNet 的 evaluation 性能稍好,二者通过 averaging softmax output 结合起来使用效果比二者之一要好。

2.6.4 卷积网络融合(ConvNet Fusion)

\quad \quad 多模型融合是基于多个网络softmax输出的结果的平均,该方法在AlexNet和OverFeat中也有用到。

\quad \quad 融合多卷积网络前,作者分别就单尺度或者多尺度训练了模型,七个模型ensemble后的性能可以达到7.3%的top-5 error。最终作者选出两个最好的多尺度模型(D、E)融合,并使用dense和multi-crop的evaluation,top-5 error降到7.0%。最好的单模型是E,top-5 error为7.1%

\quad \quad 与其他STOA的模型比较来看,单模型里最好的还是VGG,比GoogLeNet最好的单模型也要少0.9%的top-5 error。

三、总结

3.1 选用 1×1 卷积核的原因

\quad \quad 作者首先认为1×1卷积是增加决策函数(decision function,这里的决策函数我认为就是softmax)的非线性能力而不影响卷积层感受野的一种方式,非线性是由激活函数ReLU决定的,本身1×1 卷积则是线性映射,即将输入的feature map映射到同样维度的feature map。作者还提到“Network in Network” architecture of Lin et al. (2014).这篇文章就大量使用了1×1卷积核。

\quad \quad 总结下1×1卷积的特点(就不说加入非线性这个conv自带的特点了):S

  1. 专注于跨通道的特征组合:conv1x1 根本不考虑单通道上像素的局部信息(不考虑局部信息),专注于那一个卷积核内部通道的信息整合。conv3x3 既考虑跨通道,也考虑局部信息整合;
  2. 对 feature map 的channel级别降维或升维:例如224x224x100的图像(或feature map)经过20个conv1x1的卷积核,得到 224x224x20 的 feature map。尤其当卷积核(即filter)数量达到上百个时,3×3 或 5×5 卷积的计算会非常耗时,所以 1×1 卷积在 3×3 或 5×5 卷积计算前先降低 feature map 的维度。

3.2 为什么改用小卷积核

  1. 两个3 x 3叠加就能有5 x 5的感受野,三个3 x 3叠加就能有7 x 7的感受野(画图就能理解),而这些3 x 3的卷积层之间还有两个或三个ReLU层,ReLU的非线性性质能使网络的辨别(拟合)能力更强(相较于大卷积核仅一层ReLU);

  2. 大卷积核参数多,计算量大(假设输入输出channel均为$C $,当用三个3 x 3替代一个7 x 7时,前者参数量 3 × ( 3 × 3 × C ) × C = 27 C 2 3\times(3\times3\times C)\times C=27C^2 3×(3×3×C)×C=27C2,后者参数量 7 × 7 × C × C = 49 C 2 7\times7\times C\times C=49C^2 7×7×C×C=49C2 ,式中有$C^2 是 因 为 一 个 是因为一个 C 是 卷 积 核 c h a n n e l 数 , 另 一 个 是卷积核channel数,另一个 channelC$是卷积核个数 / feature map个数。

\quad \quad 在同样的RGB图(224x224x3)上就conv3x3、conv5x5、conv7x7、conv9x9和conv11x11的卷积核做卷积(设置pad=1,stride=4,output_channel=96),计算卷积层的参数规模和得到的feature map的大小如下表:

\quad \quad 可以看出大卷积核带来的参数量并不大(卷积核参数+卷积后的feature map参数,不同kernel大小这二者加和都是30万的参数量),实际增大的是计算量(上面计算量的公式中最后要乘以2,代表乘加操作)。

3.3 VGG-16网络结构图:

3.4 VGG-16参数表

参数来自斯坦福CS231n的计算:

NUMLAYERFEATURE MAPMEMORYWEIGHTS
INPUT[224x224x3]224x224x3=150K0
1CONV3-64[224x224x64]224x224x64=3.2M(3x3x3)x64 = 1,7282
2CONV3-64[224x224x64]224x224x64=3.2M(3x3x64)x64 = 36,864
POOL2[112x112x64]112x112x64=800K0
3CONV3-128[112x112x128]112x112x128=1.6M(3x3x64)x128=73728
4CONV3-128[112x112x128]112x112x128=1.6M(3x3x128)x128=147456
POOL2[56x56x128]56x56x128=400K0
5CONV3-256[56x56x256]56x56x256=800K(3x3x128)x256=294912
6CONV3-256[56x56x256]56x56x256=800K(3x3x256)x256=589824
7CONV3-256[56x56x256]56x56x256=800K(3x3x256)x256=589824
POOL2[28x28x256]28x28x256=200K0
8CONV3-512[28x28x512]28x28x512=400K(3x3x256)x512=1179648
9CONV3-512[28x28x512]28x28x512=400K(3x3x512)x512=2359296
10CONV3-512[28x28x512]28x28x512=400K(3x3x512)x512=2359296
POOL2[14x14x512]14x14x512=100K0
11CONV3-512[14x14x512]14x14x512=100K(3x3x512)x512=2359296
12CONV3-512[14x14x512]14x14x512=100K(3x3x512)x512=2359296
13CONV3-512[14x14x512]14x14x512=100K(3x3x512)x512=2359296
POOL2[7x7x512]7x7x512=25K0
14FC[1x1x4096]40967x7x512x4096=102760448
15FC[1x1x4096]40964096×4096=16777216
16FC[1x1x1000]10004096×1000=4096000
TOTAL memory24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params138M parameters

四、Reference

[1]VGGNet阅读理解(https://blog.csdn.net/zziahgf/article/details/79614822 )

[2]VGGNet论文笔记(https://zhuanlan.zhihu.com/p/55387920)

[3]深度学习(二十)基于Overfeat的图片分类、定位、检测_hjimce的专栏-CSDN博客_overfeat(https://blog.csdn.net/hjimce/article/details/50187881)

本篇文章若对您有帮助请收藏或关注,如若转载请注明出处!共同进步,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bobodareng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值