《Very Deep Convolutional Networks for Large-scale Image Recognition》
2014,牛津大学计算机视觉组(Visual Geometry Group)et al,VGGNet
VGG探索了卷积神经网络深度与其性能之间的关系,通过反复堆叠3*3的小型卷积核和2*2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络。VGGNet相比之前state-of-the-art的网络结构,错误率大幅下降,并取得了ILSVRC 2014比赛分类项目的第二名和定位项目的第一名。同时,VGGNet的扩展性很强,迁移到其他图片数据上的泛化性非常好。VGGNet的结构非常简洁,整个网络都使用同样大小的卷积核尺寸(3*3)和最大池化层(2*2),卷积步长为1,都采用ReLU作为激活函数。
利用多个堆叠的更小尺寸的卷积核取得的效果优于使用更大尺寸的卷积核,因为多个非线性层会增加网络的深度,从而允许其学习更复杂的特征,并且计算成本更低。
网络结构:
VGGNet各级别网络参数量:
虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1*1的卷积层。
注:1*1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。
Trick:VGGNet在训练时有一个技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。
(1)训练(Trick):VGG使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁剪成224*224的图片,这样能增加很多数据量,对于防止过拟合有很不错的效果。方法1:固定S,对应于单一尺寸的训练,S=256和S=384。方法2:多尺度训练,S的取值范围为[256,512],随机采样S来单独地重新缩放每个训练图像(类似于缩放)。因为图像中的对象可以具有不同的大小,因此在训练期间将这一点考虑进去时非常有益的。也可以看成是通过尺寸抖动的训练集增加,其中单个模型被训练以识别大范围尺度上的对象。
(2)测试(Trick):将图像scale到一个尺寸Q(测试尺寸),将全卷积层首先转换成卷积层(第一个FC层转换为7*7的卷积层,最后两个FC层转成1*1的卷积层)。然后将所得到的全卷积网络应用于整个(未裁剪)的图像,结果是类别分数图(其通道数量等于类的数量)和一个变化的空间大小(取决于输入图像的大小)。最后,为了获得图像的类分数的固定大小向量,类别分数图被空间平均了。我们也通过水平翻转图像来增加测试集,将原始图像和翻转图像的softmax分类后验概率进行平均,以获得图像的最终分数。
各级别VGGNet在使用Multi-Scale训练时的top-5错误率。(缩放还是有提升的)
作者在对比各级网络时总结出了以下几个观点:
(1)LRN层作用不大;(2)越深的网络效果越好;
(3)1*1的卷积也是很有效的,但没有3*3的好,大一些的卷积可以学习更大的空间特征。
VGGNet拥有5段卷积,每一段内有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对特征的学习能力更强。
析:使用尺寸小的卷积的好处?
(1)更少的参数量;(2)更多的非线性变换,使得CNN对特征的学习能力更强;
(3)隐式的正则化效果(收敛速度要快)。等等
析:感受野的概念及大小的计算?
在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
感受野大小的计算采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层,使用的公式可以表示如下:
RF = 1 #待计算的feature map上的感受野大小
for layer in (top layer To down layer):
RF(out) = ((RF -1)* stride) + fsize
stride 表示卷积的步长; fsize表示卷积层滤波器的大小。