天天看点

VGG学习总结

论文题目:Very Deep Convolutional Networks for Large-Scale Image Recognition

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

注:为了方便理解,博文结尾给出了一些概念的链接以及一些重要的参考文献。

1 网络结构

文章分别使用了6种不同深度的网络进行对比,这6种网络的结构如下:

VGG学习总结

这几个网络都有一致的配置,只有层数不一样,用A,B,…E命名,输入的图像是224x224的RGB图像,做过的预处理是将图像的每个像素减去RGB均值。卷积层的步长是1,pooling层是2x2的,步长为2,最后连接三个全连接层后再接一个softmax进行分类,使用的激活函数为ReLU。这几个网络里只有A-LRN中使用了Local Response Normalisation (LRN) normalisation[1],由于使用了LRN效果没有提升,反而增加了计算时间,所以在B,C,D,E的对比中不再将LRN引入。

虽然加深了网络的深度,但是参数的数量并没有比浅层的神经网络的参数多太多(后边会讨论)

2 实验过程

训练过程

训练使用的是带有动量的mini-batch梯度下降的方法,batch大小为256,动量设置为0.9,训练正则项所乘的参数设置为5*10-4(10的-4次方),dropout率设置为0.5,learning rate设置为10的-2次方。实验训练了370k次(74个epochs)。

论文提到网络权重的初始化很重要,初始化不好了可能会让学习停止。论文是这样做的,先对A网络进行随机初始化参数进行训练,然后,将训练好的A网络的参数去初始化后边深层网络的前4层以及全连接层,剩下的层是用均值为0,方差为0.01的正态分布去随机初始化的,并且biases初始化为0。并且论文里提到,可能存在不需要预训练参数直接进行初始化参数的方法,需要进一步探索。

为了获得224x224的输入图像,论文里是对原图进行各向同性的放缩后,采取随机裁剪的方式获得的,使用S代表放缩后的图像的最短边,所以S>=224。为了扩充数据集,裁剪后的图像进行了随机的水平翻转以及随机的RGB颜色转换[1]

同时呢,论文的还采用了多种尺度的训练方式,就是将原始图片采用不同的S放缩后进行裁剪训练,比如让S=256,S=384分别训练,还有一种动态改变S的方式,就是给定S的范围[Smin,Smax],让每张训练图片随机选取S进行训练,这样相当于通过尺度抖动来增强数据。

测试过程

首先,图像的最小边被各向同性的缩放成预定义的尺寸,设为Q,Q并不一定要与训练尺寸S相同。然后,根据[2]中的方法将网络密集的应用在经过尺寸缩放的测试图像上。即先将全连接层转换成卷积层(第一个全连接层转换成7×7的卷积层,后两个全连接层转换成1×1的卷积层),再将这样得到的全卷积网络运用在整幅图像上(未裁切的)。输出是一个分类得分图,通道的数量和类别的数量相同,空间分辨率依赖于输入图像尺寸。最终为了得到固定尺寸的分类得分向量,将分类得分图进行空间平均化(求和——池化)。同样使用水平翻转来对测试集进行数据增强;在原始图像和翻转图像上的soft-max分类概率的平均值作为这幅图像的最终得分。

实验结果

实验使用的是 ILSVRC-2012数据集,分为三部分,训练集:1.3M images,验证集:50k images,测试集:100k images

VGG学习总结

Table3是单尺度的实验结果,从Table3可以看出,1,使用LRN并没有提升效果,2,从A中的11层到D中的16层,随着网络深度的增加,错误率下降,但是E中的19层却没有进一步的提升,说明已经饱和,可能需要更多的 数据集得以提升,3,C(加的1x1卷积核)比D(加的3x3卷积核)的效果要差,说明增加额外的非线性确实有效(因为C比B好,后边讨论1x1卷积的功能),但是使用卷积核捕捉图像的空间信息很重要。

VGG学习总结

Table4是一个多尺度的实验结果,可以看到,采用[256,512]抖动尺度的训练结果最好,将top5错误降低到了8.0%

VGG学习总结

此外,论文里最后还采用了一种网络融合的方式提高精度,通过计算多个模型不同尺度的soft-max分类概率的平均值来对它们的输出进行组合,可以看到error进一步下降

不同模型的比较

VGG学习总结

当然这是2014年的论文了,比较的是当时的成果,Google那个指的GoogleNet

关于论文剩下的部分是讲定位的,这里就不做笔记了,因为关于目标检测已经有了更好更新的技术,比如faster-rcnn,Yolo等等,但是VGG的网络却被这些先进的框架所应用,说明也是相当经典了,下边有一些关于论文中的一些问题的讨论,里边有一些是论文里的,一些是我的感悟,我想在设计网络的过程中很有启发意义,在此记录一下。

讨论

1, 小的卷积核的深层网络性能优于大卷积核的浅层网络

2,小的卷积核的卷积层连用(中间没有pooling)和大的卷积核单用的感受野是相同的,比如2个3x3的卷积层连用和一个5x5的卷积层的感受野一样,3个3x3的卷积层和一个7x7的卷积层感受野一样。

3,小的卷积核的连用可以让决策函数变得更有区分度,并且可以大大降低参数的数量,这就是文章里深层网络的参数却比浅层网络参数没多多少的原因

4,深层网络适合于大的数据集

5,关于1x1卷积核的作用:首先,增加决策函数的非线性,其次,对特征进行了转换,相当于“feature pooling”,比如把300x300x50的特征图可以降到300x300x20。

6,使用预训练好的参数初始化可以加速训练

一些链接:

1,关于1x1卷积核更详细的解释:http://iamaaditya.github.io/2016/03/one-by-one-convolution/

2,loss function和decision function的区别:https://stats.stackexchange.com/questions/104988/what-is-the-difference-between-a-loss-function-and-decision-function

3,Softmax的特点和作用:https://www.zhihu.com/question/23765351

4,神经网络激励函数的作用:https://www.zhihu.com/question/22334626/answer/21036590

5,CNN计算感受野:http://blog.csdn.net/bojackhosreman/article/details/70162018

6,迭代iteration和时期epochs之间的关系和区别:https://www.quora.com/What-is-the-difference-between-iterations-and-epochs-in-Convolution-neural-networks

参考文献

[1]A. Krizhevsky, I. Sutskever, and G. E. Hinton. ImageNet classification with deep convolutional neural networks. In NIPS, pages 1106–1114, 2012.

[2] P. Sermanet, D. Eigen, X. Zhang, M. Mathieu, R. Fergus, and Y. LeCun. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks. In Proc. ICLR, 2014.

继续阅读