VGG(2014),3x3卷积的胜利
博客:blog.shinelee.me | 博客园 | CSDN
写在前面
VGG(2014)网络出自paper《Very Deep Convolutional Networks for Large-Scale Image Recognition》,为ILSVRC2014 localization冠军和classification亚军方法(冠军为GoogLeNet),首次提交arXiv时间为2014年9月,后发表在ICLR2015,截止20191011引用量达27612。因为出自牛津大学Visual Geometry Group,所以网络被命名为VGG,根据层数不同,又分为VGG16、VGG19等。
论文的主要贡献:
- 探究了网络深度对性能的影响,通过叠加卷积层来增加深度,性能变好——“Our results yet again confirm the importance of depth in visual representations”。
- 只使用\(3\times 3\)的卷积核,通过多个\(3 \times 3\)卷积层叠加来获得与大卷积核相同的感受野,同时引入更多的非线性,减少了参数。若有\(C\)个channel,3个\(3\times 3\)的卷积层参数量为\(3(3^2C^2)=27C^2\),1个\(7\times 7\)卷积层的参数量为\(7^2C^2=49C^2\),两者的感受野相同。
网络结构
文中列举了配置不同的5个网络,分别命名为A、A-LRN、B、C、D、E,网络结构及参数量如下图所示,
这些网络配置的特点是:
- A-LRN与A相比,仅在第一个卷积层后加入LRN层,A和A-LRN含可学习参数的层数均为11层
- B比A多了2个\(3 \times 3\)卷积层,为13层
- C比B多了3个\(1\times 1\)卷积层,为16层
- D将C的3个\(1\times 1\)卷积层替换为\(3\times 3\)卷积层,仍为16层
- E在D的基础上又增加了3个\(3\times 3\)卷积层,为19层
- 每次maxpool后,feature map尺寸减半,紧随其后的卷积层会将feature map的数量加倍,64→128→256→512
B网络有个特点,每2个\(3\times 3\)卷积层一组,再接maxpool。实际上,在实验中还配置了另一个网络——将B的“each pair of \(3\times 3\) conv”替换为1个\(5\times 5\)卷积层,其性能要比B差7%,所以paper认为小卷积核深网络要比大卷积核浅网络好。
paper中的实验均在上述网络中进行,下面具体看一下。
multi-scale training and testing
在训练阶段,VGG的输入固定为\(224\times 224\),对尺寸不同的图像需要先scale再crop到\(224\times 224\),理论上只需要将图像最短的边scale到大于等于224即可进行crop,paper中设置了2种scale方式,第一种scale到256或384,第二种随机scale到\([256, 512]\)之间——384恰好位于256和512的中间,做了对比实验。
测试阶段,不再进行crop操作,而是采用了Overfeat中的一个技巧,将网络最后的3个全连接层在实现上转化成卷积层,以适应不同尺寸的输入,这个技巧在paper中称之为dense。全连接层的运算方式是输入向量与权重矩阵相乘,当权重矩阵的尺寸确定了,输入向量的长度就不可改变了,而卷积的运算方式是权重在输入上滑动内积,所以只需要输入的尺寸大于kernel的窗口即可。具体地,如果输入恰好为\(224\times 224\),经历过5次maxpool后,feature map尺寸变为\(7 \times 7\),当输入尺寸大于224时,这个feature map将大于等于\(7\times 7\)。将3个全连接层依次转化为\(7\times 7\)卷积和2个\(1\times 1\)卷积,这种转化并不改变权重,只是实现方式上的变化,此时整个网络为全卷积网络。如果输入图像大于\(224\times 224\),网络最后输出的class score map将大于\(1000 \times 1\),为了得到固定长度为1000的class score vetor,只需将其进行spatially average(sum-pooled),然后再softmax。更多可以参见Converting Fully-Connected Layers to Convolutional Layers的解释。
预测阶段的multi scale,即将输入图像做不同scale,分别输入网络,对预测结果取平均。
下图分别为single scale和mutiple scale测试的结果,测试库为ILSVRC-2012 dataset,
上面的对比实验,可得出以下结论:
- 随着深度增加,性能变好
- 与A相比,A-LRN性能没有改善,LRN用途不大
- 无论是training还是testing,multiple scale均能改善性能,两者结合使用效果更佳
- 在当前数据集和网络结构配置上,VGG16(D)和VGG19(E)性能基本一样,接近饱和
对于multi scale对性能的改善,想来也是合理的,因为图像中目标的尺寸并不确定,有大有小,在训练阶段通过scale jittering来增广数据,可让网络在一定程度上cover这种变化,而在预测阶段,multi scale可以看成在输入数据上做的集成学习,亦是提升性能的常规操作。
其他有意思的点
论文中还有一些其他有意思的点,简单总结如下,
- 为了网络能正常收敛,权重的初始化很重要,原来是先训练浅层网络A,然后用A的权重初始化后面深层网络前4个卷积层和最后3个全连接层,其他层从高斯分布中随机初始化。在paper submission后发现,直接采用Understanding the difficulty of training deep feedforward neural networks中的初始化方法就可以,即Xavier方法。
- paper中评论,因为A-LRN中的Local Response Normalisation(LRN)没有效果,还增加了内存使用和计算量,所以后面的BCDE网络就不用了(微笑)。
- 在ILSVRC-2014 challenge中,VGG提交的是7模型融合结果,提交后他们测试2模型的融合结果要更好,top1 val好1%,top5 val好0.5%,不过是在multi-scale traing、multi-crop和dense一起加成下取得的结果。
- VGG (1 net, multi-crop & dense eval) 单网络比GoogLeNet单网络的性能要好约1%。
- 2014年,ImageNet竞赛Top5错误率首次进入0~10%区间。
以上。
参考
- arXiv: Very Deep Convolutional Networks for Large-Scale Image Recognition
- Large Scale Visual Recognition Challenge 2014 (ILSVRC2014)
- Review: VGGNet — 1st Runner-Up (Image Classification), Winner (Localization) in ILSVRC 2014
最新文章
- 今天<;人人都能弹吉他>;免费版获得了苹果的新品推荐
- Node.js热部署方式
- BendFord&#39;s law&#39;s Chi square test
- 微信开发教程 Yank.WeiXin.Robot
- DHCP协议讲解
- OpenERP 7.0 中文报表PDF乱码(WindowsXP)
- 在strings.xml中定义html标签
- 可编辑DIV (contenteditable=";true";) 在鼠标光标处插入图片或者文字
- Spring.NET 中的 ADO.NET 数据访问的示例
- 关于Android 7.0(API24)相机的问题汇总
- 关于mui前端传值,springboot后台接收值的问题
- oracle如何创建存储过程和调用
- 在windows 10 上使用aspnet_regiis.exe -i 命令报 “此操作系统版本不支持此选项” 的解决办法
- 28.实现 strStr() 函数
- 【VMware vSphere】ESXi系统设置静态IP
- idea 编译报错 未结束的字符串字面值,非法的类型开始
- python 历险记(二)— python 的面向对象
- js实现一条抛物线
- jquery 设计的思路-----初级
- 打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
热门文章
- CF991C Candies 二分 第十五
- POJ 3786	dp-递推 Adjacent Bit Counts *
- 洛谷 P4206 [NOI2005]聪聪与可可 题解
- JS数据结构第六篇 --- 二叉树力扣练习题
- DevExpress的GridView,为每行的动态绑定不同的RepositoryItemLookUpEdit
- web scraper 抓取数据并做简单数据分析
- Redis真的那么好用吗
- try(){}自动释放资源,AutoCloseable
- linux常用命令二
- 下一个排列(Leetcode31)解读