VGG——Very deep convolutional networks for large-scale image recognition

1. 摘要

在使用非常小(3×3)的卷积核情况下,作者对逐渐增加网络的深度进行了全面的评估,通过设置网络层数达 16-19 层,最终效果取得了显著提升。

2. 介绍

近来,卷积神经网络在大规模图像识别领域取得了巨大的成功,这一方面归功于大规模公开数据的出现,另一方面则是计算能力的提升。在 AlexNet 的基础上大家进行了很多的尝试来进行改进,一条线是在卷积层利用更小的感知窗口和更小的步长,另一条线则是在整张图片上进行训练然后测试的时候采用多尺度。在本文中,作者则集中于卷积神经网络的另一个方面——它的深度。

3. 网络结构

网络的输入是一个固定大小的 224×224 的 RGB 图像,唯一的预处理就是减去三个通道像素的均值。卷积核大小只有 3×3 和 1×1 两种,同时卷积的时候采用填充来保证卷积后空间分辨率保持不变。总共有 5 个最大池化层,它们分别跟在一些卷积层后面,池化的窗口大小为 2×2,步长也为 2。

一系列卷积层后最后是 3 个全连接层,它们的通道个数分别为 4096,4096 和 1000,最后一层采用 Softmax 来进行 1000 个类别的分类。在所有的模型中,全连接层的设置都是一样的。激活函数都选择 ReLU,如果某些层应用了 LRN,则和 AlexNet 中的参数保持一致。

作者设计了 A-E 总共六个模型,所有的模型设置都如上面所述,只是层数不同,从模型 A 有 11 层到模型 E 有 19 层。通道数从第一层的 64 逐渐增大到 512,在每一次最大池化后变为之前的两倍。

和以前的网络结构在第一层采用比较大的卷积核不同,作者在所有的卷积层都采用了 3×3 的卷积核,步长为 1。至于为什么要这样做呢?

两个 3×3 的卷积层叠加后(不经过池化)其感知野是 5×5,三个 3×3 的卷积层也就具有了 7×7 的感知野。那为什么要用几个 3×3 卷积层的叠加而不只用一个 7×7 的卷积层呢?

其一,三个卷积也就是三个非线性的叠加让决策函数比只有一个非线性更有判别性。

其二,这样会减少参数的数量。假设 3 个连续 3×3 卷积层的输入输出通道数都一样,为 C C C,那么它们叠加后的参数量为 3 3 2 C 2 = 27 C 2 3*3^2C^2=27C^2 332C2=27C2,而如果采用一个 7×7 的卷积层,参数量为 7 2 C 2 = 49 C 2 7^2C^2=49C^2 72C2=49C2,后者比前者参数数量多了 81%。这就可以看作是对 7×7 卷积核强加了一个正则化,将它分解为几个 3×3 的卷积核,并且在其间插入非线性。

其中,1×1 的卷积核可以看作是在不改变感知野的情况下增加非线性的一种方法,作者在实验中设置它们的输入输出通道数一样。

4. 分类框架

4.1. 训练过程

训练采用带动量的梯度下降算法,以及 L 2 L_2 L2 正则化和 Dropout 技术。其中,为了让模型快速收敛,作者先对比较浅的模型 A 随机初始化然后进行训练。在训练更深的网络时,对前四个卷积层和最后三个全连接层用网络 A 对应层的参数来初始化,中间层则使用均值为 0 方差为 0.01 的高斯分布来初始化,偏置参数初始化为 0。

固定大小的 224×224 输入图片,则是从调整后的训练图片中随机裁剪出来的,一张图片在一个迭代过程中只裁剪一次。为了扩充训练集,作者再对图片进行了随机水平翻转和随机 RGB 颜色偏移。

调整后的图片短边大小为 S,也称之为训练尺度,对此作者有两种设置。一种是单尺度,也即 S 是固定的,在实验中作者取 S=256 和 S=384。为了加速 S=384 网络的训练,先用 S=256 预训练网络的参数来对其进行初始化。另一种是多尺度,每张图片调整后的大小 S 是从一个范围内 [ S m i n , S m a x ] [S_{min},S_{max}] [Smin,Smax]随机采样的,其中 $ S_{min}=256,S_{max}=512$。之所以这么做,是因为图片中的物体大小本来就不一样,这样一个模型就被训练为能够识别各个尺度规模的物体。

4.2. 测试过程

测试阶段调整后的图片大小为 Q,称之为测试尺度。测试尺度和训练尺度没有必要一样,而且作者发现针对每个 S 采取几个不同的 Q 会对结果有所提升。然后,作者将网络中的三个全连接层全部转化为了卷积。

网络的原始输入大小为 224×224×3,经过一系列卷积和 5 次最大池化后,输入全连接时的特征图大小为 7×7×512,然后第一个全连接层神经元个数为 4096,这一层的参数 W 的大小也即为 (7×7×512*4096)。将全连接转化成卷积的意思就是,可以将 W 看作是 4096 个 7×7×512 的卷积核,卷积后特征图也就变成了 1×1×4096。同理,第二个全连接层的权重可以看作是 4096 个 1×1×4096 的卷积核,第三个全连接层的权重可以看作是 1000 个 1×1×4096 的卷积核。

然后,重新调整后的测试图片便可以直接传入到网络中去,因为全都是卷积层,输入大小没有限制。但是,这样的话,最后得到的特征图可能不是 1×1×1000 的,而是 W×H×1000 的,为了得到一个 1000 维的向量,我们需要进行空间平均(求和池化)。作者也对测试图片进行了水平翻转,最终的结果则取它们的平均值。

因为作者是将整个测试图片输入到网络中进行测试,也就没有必要去多次裁剪多次计算,但是,为了对比,作者也进行了多次裁剪的实验和先前的工作进行对比。

5. 实验结果

5.1. 单尺度验证

对一张图片,只选取一个 Q 值运行一次模型进行测试。对于单尺度训练的模型,选取 Q=S,对于多尺度训练的模型,取 Q = 0.5 ( S m i n + S m a x ) Q=0.5(S_{min}+S_{max}) Q=0.5(Smin+Smax),结果如下。

可以发现,网络加深后错误率逐渐下降。模型 C 和 D 具有一样的层数,但是 C 中引入了一些 1×1 的卷积,D 的错误率比 C 低,说明非线性和捕获空间信息同样重要。同时,用 3×3 卷积核的深层网络比用 5×5 的浅层网络效果要好,也验证了作者的结论。最后,用多尺度训练的模型比单尺度训练的模型效果要好,说明捕获多尺度的图片特性是有帮助的。

5.2. 多尺度验证

对一张图片,选取不同的 Q 值多次运行模型取平均来进行测试。对于单尺度训练的模型,选取 Q={S-32,S,S+32},对于多尺度训练的模型,取 Q = { S m i n 0.5 ( S m i n + S m a x ) S m a x } Q=\{S_{min},0.5(S_{min}+S_{max}),S_{max}\} Q={Smin0.5(Smin+Smax)Smax},结果如下。

5.3. 多裁剪验证

对测试图片多次裁剪,然后进行测试。

5.4. 多模型融合验证

对多个模型输出的结果进行平均作为最终的结果。

5.5. 与以前的方法对比

获取更多精彩,请关注「seniusen」!

全部评论

相关推荐

04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务