VGGNet:Very Deep Convolutional Networks for Large-Scale Image Recognition
参考:
https://blog.****.net/wcy12341189/article/details/56281618
https://blog.****.net/wangsidadehao/article/details/54311282 全文翻译
https://blog.****.net/qq_31531635/article/details/71170861
https://blog.****.net/marsjhao/article/details/72955935
ABSTRACT
1 Introduction
2 ConvNet Configurations
2.1 Architecture Configutations
训练时,输入大小为224*224的RGB图像,预处理只有在训练集中的每个像素上减去RGB的均值。为了在公平的原则下探究网络深度对模型精确度的影响,所有卷积层有相同的配置,即卷积核大小为3x3,步长为1,填充为1;共有5个最大池化层,大小都为2x2,步长为2;共有三个全连接层,前两层都有4096通道,第三层共1000通道代表1000个标签类别;最后一层为softmax层;所有隐藏层后都带有ReLU非线性**函数。实验证明,AlexNet中提出的局部响应归一化(LRN)对性能提升没有帮助,而且还浪费了内存的计算的损耗。
表1为VGGNet各级别的网络框图,从左至右每一列代表着深度增加的不同的模型,从上至下代表模型的深度,其中conv<滤波器大小>-<通道数>,至于为什么用3x3的滤波器尺寸,是因为这是能捕捉到各个方向的最小尺寸了,如ZFNet中所说,由于第一层中往往有大量的高频和低频信息,却没有覆盖到中间的频率信息,且步长过大,容易引起大量的混叠,因此滤波器尺寸和步长要尽量小。
表2所示为每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1*1的卷积层,1*1卷积的意义主要在于不影响输入输出维数的晴况下(没有发生降维),对输入通道进行线性变换,增加决策函数的非线性表达能力且不会影响到感受野的大小。
2.2 Discussion
VGGNet是5段卷积特征提取(有5个max-pooling层),每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64-128-256-512-512。其中经常出现多个完全一样的3*3的卷积层堆叠在一起的情况,这其实是非常有用的设计。如图所示,两个3*3的卷积层串联相当于1个5*5的卷积层,即一个像素会跟周围5*5的像素产生关联,可以说感受野大小为5*5。而3个3*3的卷积层串联的效果则相当于1个7*7的卷积层。除此之外,3个串联的3*3的卷积层,拥有比1个7*7的卷积层更少的参数量,只有后者的(3*3*3)/(7*7)=55%。最重要的是,3个3*3的卷积层拥有比1个7*7的卷积层更多的非线性变换(前者可以使用三次ReLU**函数,而后者只有一次),使得CNN对特征的学习能力更强。
之前的网络都用7x7,11x11等比较大的卷积核,现在全用3x3不会有什么影响吗? 实际上,一个5x5可以用两个3x3来近似代替,一个7x7可以用三个3x3的卷积核来代替,多个卷积层与非线性的**层交替的结构,比单一卷积层的结构更能提取出深层的强力特征,不仅提升了判别函数的识别能力,而且还减少了参数。如3个3x3的卷积层的组合通道数为C,参数为3x(3x3xC^2)=27C^2,一个单独的7x7卷积层,通道数也为C,则参数为(7x7xC^2)=49C^2。 直观来说最好选择带有小滤波器的卷积组合,而不是用一个带有大的滤波器的卷积层。唯一的不足时,在进行反向传播时,中间的卷积层可能会导致占用更多的内存。
3 Classification Framework
3.1 Training
训练使用加动量的mini-batch基于反向传播的梯度下降法来优化多项逻辑回归目标。batch size为256,动量为0.9,权值衰减参数为5*10^(-4),在前两个全连接层使用dropout为0.5,学习率为0.01,且当验证集停止提升时以10的倍数衰减,同时,初始化权重取样于高斯分布N(0,0.01),偏置项初始化为0。 在训练时比AlexNet收敛所需训练次数要少,因为:(1)使用小卷积核和更深的网络进行的隐性正则化;(2)在特定的层进行参数的pre-initialisation-预初始化。对于较浅的网络,如网络A,可以直接使用随机数进行随机初始化,而对于比较深的网络,则使用前面已经训练好的较浅的网络中的参数值对其前几层的卷积层和最后的全连接层进行初始化。
pre-initialisation:网络A的权值W~(0,0.01)的高斯分布,bias为0;由于存在大量的ReLU函数,不好的权值初始值对于网络训练影响较大。为了绕开这个问题,作者现在通过随机的方式训练最浅的网络A;然后在训练其他网络时,把A的前4个卷基层(感觉是每个阶段的以第一卷积层)和最后全连接层的权值当做其他网络的初始值,未赋值的中间层通过随机初始化。
VGGNet在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。
训练图像大小:为了获得初始化的224x224大小的图片,通过在每张图片在每次随机梯度下降SGB时进行一次裁减,为了更进一步的增加训练集,对每张图片进行水平翻转以及进行随机RGB色差调整。
初始对原始图片进行裁剪时,原始图片的最小边不宜过小,这样的话,裁剪到224x224的时候,就相当于几乎覆盖了整个图片,这样对原始图片进行不同的随机裁剪得到的图片就基本上没差别,就失去了增加数据集的意义,但同时也不宜过大,这样的话,裁剪到的图片只含有目标的一小部分,也不是很好。
针对上述裁剪的问题,提出的两种解决办法:(1) 固定最小边的尺寸为256
(2) Multi-Scale训练,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。实践中,S随机在[256,512]区间内进行抽样,使用Multi-Scale获得多个尺寸不一的图片,将多个版本的数据合在一起有利于训练,这个方法叫做尺度抖动 scal jittering,有利于训练集增强。 训练时运用大量的裁剪图片有利于提升识别精确率。
3.2 Testing
测试图片的尺寸不一定要与训练图片的尺寸相同,且不需要裁剪。测试的时候,首先将全连接层转换到卷积层,第一个全连接层转换到一个7x7的卷积层,后面两个转换到1x1的卷积层,这不仅让全连接网应用到整个未裁剪的整个原始图像上,而且得到一个类别的得分图,其通道数等于类别数,还有一个决定与输入图片尺寸的可变空间分辨率。为了获得固定尺寸的图片的得分图,运用原始图片的softmax的后验概率以及其水平翻转的平均来获得。
在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。
4 Classification Experiments
4.1 Single Scale Evaluation
作者在对比各级网络时总结出了以下几个观点:(1)LRN层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。);(2)越深的网络效果越好;(3)1*1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。4.2 Multi-Scale Evaluation
若设置测试图片的尺寸不一,利用尺度抖动scale jittering的方法取三个值,然后取结果的平均值。可以看到结果稍好于前者测试图片采用单一尺寸的效果。当取训练图片S利用尺度抖动的方法范围为[256;512],测试图片也利用尺度抖动取256,384,512三个值进行分类结果平均值。