VGGNet是2014年 ILSVRC 分类亚军及定位冠军模型,top-5 错误率 7.3% ,vgg继承了lenet以及alexnet的一些框架,有16~19层,vggnet虽然在分类成功率上稍显逊色,但在多个迁移学习任务中表现优于googlenet,同时VGGNet的拓展性很强,迁移到其他图片数据上的泛化性非常好。而且 从图像中提取CNN特征,VGGNet是首选方法。VGG的缺点是需要更大的存储空间,参数总量达140M。
VGGNet是牛津大学计算机视觉组(VisualGeometry Group)和GoogleDeepMind公司的研究员一起研发的的深度卷积神经网络。VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3 * 3的小型卷积核和2 * 2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络。VGGNet相比之前state-of-the-art的网络结构,错误率大幅下降。
最主要的贡献点:发现使用小尺寸的卷积核能够设计比较深的网络。
3*3是最小的能够捕捉上下左右和中心概念的尺寸;
两个3 * 3的卷积层串联相当于1个5 * 5的卷积层,3个3 * 3的卷积层串联的效果则相当于1个7*7的卷积层;
多个3*3的卷积层比1个大尺寸的卷积层有更多的非线性变换(前者可以使用多次ReLU激活函数),使判决函数更加具有判决性;
多个3*3的卷积层比1个大尺寸的卷积层有更少的参数;
现在解释参数变少的问题。
假设现在有 3 层 3x3 卷积核堆叠的卷积层,卷积核的通道是 C 个,那么它的参数总数是 3x(3Cx3C) = 27C^2。同样和它感受野大小一样的一个卷积层,卷积核是 7x7 的尺寸,通道也是 C 个,那么它的参数总数就是 49C^2。通过计算很容易得出结论,3x3 卷积方案的参数数量比 7x7 方案少了 81% 多,并且它的层级还加深了。
VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3* 3)和最大池化尺寸(2*2)。到目前为止,VGGNet依然经常被用来提取图像特征。VGGNet训练后的模型参数在其官方网站上开源了,可用来在特定的图像分类任务上进行再训练 (相当于提供了非常好的初始化权重),因此被用在了很多地方。
VGGNet论文中全部使用了3 * 3的卷积核和2*2的池化核,通过不断加深网络结构来提升性能。图1-2所示为VGGNet各级别的网络结构图,图3所示为每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。
介绍结构图的式子含义
虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1*1的卷积层,1*1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。
VGGNet拥有5组卷积,每一组内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64-128-256-512-512。其中经常出现多个完全一样的3*3的卷积层堆叠在一起的情况,这其实是非常有用的设计。
如图4所示,两个33的卷积层串联相当于1个55的卷积层,即一个像素会跟周围55的像素产生关联,可以说感受野大小为55。而3个33的卷积层串联的效果则相当于1个77的卷积层。除此之外,3个串联的33的卷积层,拥有比1个77的卷积层更少的参数量,只有后者的(333)/(77)=55%。最重要的是,3个33的卷积层拥有比1个7*7的卷积层更多的非线性变换(前者可以使用三次ReLU激活函数,而后者只有一次),使得CNN对特征的学习能力更强。
堆叠后的 3x3 卷积层可以对比之前的常规网络的基础上,减少参数数量,而加深网络。
但是,如果我们还需要加深网络,怎么办呢?堆叠更多的的卷积层,但有 2 个选择。
选择 1:继续堆叠 3x3 的卷积层,比如连续堆叠 4 层或者以上。
选择 2:在 3x3 的卷积层后面堆叠一层 1x1 的卷积层。
1x1 卷积核的好处是不改变感受野的情况下,进行升维和降维,同时也加深了网络的深度。
VGGNet在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。
首先对原始图片进行等比例缩放,使得短边要大于224,然后在图片上随机提取224x224窗口,进行训练。由于物体尺度变化多样,所以多尺度(Multi-scale)可以更好地识别物体。
Multi-scale其实本身不是一个新概念,学过图像处理的同学都知道,图像处理中已经有这个概念了,我们学过图像金字塔,那就是一种多分辨率操作。
只不过VGG网络第一次在神经网络的训练过程中提出也要来搞多尺寸。目的是为了提取更多的特征信息。像后来做分割的网络如DeepLab也采用了图像金字塔的操作。
注: 因为训练数据的输入为224x224,从而图像的最小边S,不应该小于224
在训练中,VGGNet还使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224*224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
实践中,作者令S在[256,512]这个区间内取值,比固定的S=256与S=512的结果显著提升,使用Multi-Scale获得多个版本的数据,并将多个版本的数据合在一起进行训练。
multi-scale训练确实很有用,因为卷积网络对于缩放有一定的不变性,通过multi-scale训练可以增加这种不变性的能力。
最终,作者认为相对于multi-crop的在精度上的提高并不能弥补其在计算量上的消耗,但作者最后还是对比了这两种方法的效果
图5所示为VGGNet使用Multi-Scale训练时得到的结果,可以看到D和E都可以达到7.5%的错误率。最终提交到ILSVRC 2014的版本是仅使用Single-Scale的6个不同等级的网络与Multi-Scale的D网络的融合,达到了7.3%的错误率。不过比赛结束后作者发现只融合Multi-Scale的D和E可以达到更好的效果,错误率达到7.0%,再使用其他优化策略最终错误率可达到6.8%左右,非常接近同年的冠军Google Inceptin Net。
VGG-19 表现的结果自然最好。但是,VGG-19 的参数比 VGG-16 的参数多了好多。所以,综合考虑大家似乎更喜欢 VGG-16。
同时,作者在对比各级网络时总结出了以下几个观点:
(1)LRN层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。);
(2)越深的网络效果越好;
(3)1 * 1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。
网络深度对结果的影响(同年google也独立发布了深度为22层的网络GoogleNet)
对于较浅的网络,如网络A,可以直接使用随机数进行随机初始化,而对于比较深的网络,则使用前面已经训练好的较浅的网络中的参数值对其前几层的卷积层和最后的全连接层进行初始化。
VGG和GoogLenet是2014年imagenet竞赛的双雄,VGG主要分为VGG16和VGG19。其网络结构与预训练模型的地址如下:
VGG16的网络结构:https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md
VGG16的预训练模型: http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_16_layers.caffemodel
VGG19的网络结构:https://gist.github.com/ksimonyan/3785162f95cd2d5fee77#file-readme-md
VGG19的预训练模型:http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_19_layers.caffemodel
备注:上面的网络结构需要进行细微调整才能在Caffe中直接训练,主要是网络结构中的Type类型。