由Andrew Zisserman 教授主导的 VGG 的 ILSVRC 的大赛中的卷积神经网络取得了很好的成绩,这篇文章详细说明了网络相关事宜。
文章主要干了点什么事呢?它就是在在用卷积神经网络下,在采用小的卷积核与小的移动步长的情况下,探索一下网络的深度对目标识别率的影响。
网络的大体结构
网络的输入为224*224的RGB图片,后面跟卷积层,卷积核的大小基本都为3*3有最小的可以保留图片空间分瓣率的卷积核,步长为1个像素,偶尔会有1*1的卷积核,这就相当于加入了一个非线性变换而已。再往后接pooling 层,它的大小为2*2,步长为2个像素,并且采用MAX-pooling的方法;再往后就是三层的全连层,第一层为4096个单元,第二层为4096个单元,第三层为1000个单元,即对应1000个类别,根据这1000个单元的输出其实这样就可以分类了;再往后为一个softmax层,目的其实就是用于计算网络的代价函数时用于求误差。就这样了,这就是整个网络的结构。根据网络的深度不同,文中探索了五种网络结构,如下所示:(黑色字体部分为网络相对于前一层增加的部分)
在上图中,如网络中的 conv3-512,表示网络的卷积核的大小为3*3, 共有512个feature map. 另外,maxpool的具体配置没有写出来。
另外,在上面的网络配置中,每经过一个 maxpooling的时候,它的feature map就增加一倍哦, 不对过maxpooling的话,feature map 的个数不变的,这样做的目的方便增加网络的深度;
网络采用最小的卷积核 3*3, 其实呢,当两层的3*3的卷积层叠加时相当于一个5*5的卷积层(因为它们对应的接收域是相同的),当三层的3*3的卷积层叠加时相当于一个7*7的卷积层哦。所以呢,文中的做法就是减少了卷积层的宽度,而增加了卷积层的深度,这样做有一个好处,可以减少参数的个数。例如:三层的3*3有卷积层的参数个数为3* 3*3* num_featuremap, 而一层的7*7 的卷积层的参数个数为:7*7*num_featuremap。 是不是减少了好多呢,哈哈哈。 既然参数减少了,这个过程也就相当于一个隐形的对网络一种 regularization。
网络的训练一些相关细节:
网络采用常用的mini-batch 的梯度下降法进行网络的训练, size为256;权值更新的原则也是常用的 momentum 的方法,动量值为0.9; 对网络的权值 decay 采用L2正则化方法,其中惩罚因子为5*10; 对最后的全连接层的前两层采用 dropput 的正则化机制, dropout的值为0.5;网络的学习率的大体设置为:初始值为0.01,当进入plateau时(可以认为验证值的识别率不再变化,当然也可以选其它的哦,如:lossValue),学习率 缩小10倍,变为0.001,然后再重复一次,变为0.0001就OK了。
权值的初始化是一个重要的问题:对于深层的网络来说,网络的权值初始值特别特别容易影响最后的识别率的,而相对于比较 shallow的网络的初始值我们可以用随机初始化的方法解决的哦。所以文中的做法就是随机初始化(用mean为0,variance为0.01的高斯分布)相当shallow的网络 A,然后训练完成啦,当我们训练其它相当于较深的网络的时候,我们用网络A的权值来初始化其它网络的权值就OK了,在训练过程中,我们的学习率初始值同样保持为0.01,好让它们充分学习嘛。
网络的输入的图片的选择问题:
我发现这个在文章中显的很重要呢,,,好像网络的没有什么创新,然后在这个方面下工夫来提高识别率吧,, 不过这个太也什么了吧。。。没点。。。。啥啥呢。。感觉。。。。。哎,,,这一部分吧,看得也有点模糊哦。额。。
网络的训练:对于训练时的图片我还能看懂,就是把图片调整为边长最小的(估计不是正方形的吧)为Q,Q为256,或384,或在(256,512)之间的值。然后呢,在上面随机采样224*224大小的区域,然后去训练就可以啦,还是每次迭代时都是再重新彩样的。在训练时,为了加快速度,当我们训练完Q为256的时候,当我们再训练Q=384时,我们的网络用Q为256权值初始化,然后把学习率调整为0.001再训练。。 当我们训练Q=(256,512)之间的值时, 我们的网络用Q为384权值初始化,然后把学习率调整为0.001再训练。。
测试网络的过程:在测试网络过程中吧,同样是把图片调成 multi-scale,即不同大小嘛。。然后吧,后面分两种方法哈:第一种dense evaluation, 这个吧就是 fully-convolutional networks.可以参考我之前写过的 对 OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 一文的理解,第二种方法吧,就是在图片上进行multi-crop,然后送给网络进行测试,这样计算量很大的其实。反正吧,文中说它们之间可以进行 complementary.为什么呢?1,采用dense的 evaluation时,窗口的采样率为2*2*2*2*2=32个像素的(一共5个步长为2的max-pooling),而如果用multi-crop的话,我们可以人为控制步长了吧;2,采用dense evaluation与 multi-crop时的一点小差别为:可能由于zero-padding 导制边缘数据不一样,这样很容易理解啦( dense evaluation 时补充的为相邻的像素值,而 multi-crop补充的为0嘛)。
结果表明了什么呢?首先看 A 与 A-LRN, 说明了局部的正则化 不起毛作用啊,白白增加了计算量,所以,后面的网络就不用它了。现看网络B与网络C-1,它俩的区别在于C-1增加了一层的卷积核为1 的卷积层,即相当于此引入了非线性,结果呢,识别的错误率有所下降,说明起点作用啦(这样也可以,竟然,,,我怎么觉得在瞎搅gu 呢)。再看D-1与C-1,它们的区别在于把C-1中的卷积核为1*1换为了3*3的卷积核,结果又有提高,说明了,用原文中的话就是 it is important to capture spatial context by using conv. 文中一句话我觉得很重要的:文中在的实验过程中表示出了当网络的深度增加到了 19层的时候,网络的错误识别率达到了饱和了,已经很难下降了哦。。。
而multi scale evaluation 对应于三个 scale 的图片,然后求它们三个的average 就可以啦,结果如下图所示:
反正这么做的结果就是:网络的性能提高了。。提高了,提高了。。。其实像这样的做法提高也在情理之中吧,,我觉得在情理之中, ,也没有什么技术含量啊。。。。。
测试网络的过程2: 对于测试的 multi-crop evaluation 与 dense evaluation的对比,反正没看明白什么意思,怎么又把网络的全连接层转为 卷积层的呢,泥马 这么做的话,权值怎么办啊。留着后续去看相关论文去寻找答案吧。
网络的实现:
网络的训练是基于caffe的,当然也对它进行修改了,主要就是来实现多GPU的加速。 文中采用的方法为把一个 min-batch 分为多份,然后让每一个 GPU 去求对应的梯度值,然后呢,再把这个GPU的梯度值进行求平均,再权值更新。。 总之吧,最后用4块
NVIDIA Titan 系列(一两万一块)的 GPU,训练网络要花2-3周, 如果我用我笔记本跑的话,单 620M的显卡, 估计可以跑一年,哈。。。。
图片分类实验:
这里要说一点我们经常见到的 top-1 error 与top-5 error是什么毛玩意呢。。。top-1 error 就是实在的错误率,概率最大一类的作为输出;而top-5 error常作为 ILSVRC 官方的识别率的测试,它指 的是概率的前5个中 只要有对应的正确的类就算是识别对了,没有就是错了。。。以前傻乎乎的不明白,现在终于知道了。。。。。。另外吧,ILSVRC分类识别中,一般我们只知道训练集与验证集哦,然后呢, 如果想要测试,那好,就提交给 ILSVRC大赛的官方服务器就可以哦,,这样做防止别人作弊。。记得15年的大赛中,某网上寻医问药有风险的互联网巨头,在2014年11月28日至2015年5月13日期间,参赛团队使用了至少30个帐号向测试服务器进行了至少200次提交,这大大超过了比赛规定的每周提交两次的上限,最后被禁止参与这样的竞赛了,哈哈哈!!!
所谓的 网络融合(convnet fusion,翻译过来应该是这个意思)
这种做法,是什么呢?很简单很简单,多个网络模型的输出结果求平均再用于识别。在ILSVRC的比赛中大家都在用,为什么呢?因为这样做基本上稍微弄弄,都可以提高网络的识别率。原理呢,可能就是所谓的不同网络模型之间有点互补吧(complementarity). 这也说明了网络的不稳定吧。。。还是没有找到本质吧。
最后文中的附录B给出了网络的generalization
即把网络的特征提取层 用到的 data set中去。
说实话,读完了这篇文章以后,给我的什么感觉呢?无非还是 trial-and-error啊啊啊啊。。。。人工智能是不是没有发展前景呢??全都是基于数学模型与算法,还有各种大数据统计,概率相关知识吧吧。,想让电脑有自己的思想,,,我觉得还好遥远远远啊啊啊。。。