一文读懂VGG网络

侃侃

网上太多关于CNN经典网络的介绍了,泛读的文章大多都从LeNet说到ResNet/DenseNet;而精读的文章质量参次不齐,而且很多介绍的并不具体。

本文旨在加深Amusi对VGG网络的印象,并尽可能详尽地来介绍VGG网络,供以后方便查询。若能顺便帮助各位CVer理解VGG网络,实属荣幸。

前言

《Very Deep Convolutional Networks for Large-Scale Image Recognition》

  • ICLR 2015

VGG是Oxford的Visual Geometry Group的组提出的(大家应该能看出VGG名字的由来了)。该网络是在ILSVRC 2014上的相关工作,主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。

VGG原理

VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。

简单来说,在VGG中,使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5*5卷积核,这样做的主要目的是在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。

比如,3个步长为1的3x3卷积核的一层层叠加作用可看成一个大小为7的感受野(其实就表示3个3x3连续卷积相当于一个7x7卷积),其参数总量为 3x(9xC^2) ,如果直接使用7x7卷积核,其参数总量为 49xC^2 ,这里 C 指的是输入和输出的通道数。很明显,27xC^2小于49xC^2,即减少了参数;而且3x3卷积核有利于更好地保持图像性质。

这里解释一下为什么使用2个3x3卷积核可以来代替5*5卷积核:

5x5卷积看做一个小的全连接网络在5x5区域滑动,我们可以先用一个3x3的卷积滤波器卷积,然后再用一个全连接层连接这个3x3卷积输出,这个全连接层我们也可以看做一个3x3卷积层。这样我们就可以用两个3x3卷积级联(叠加)起来代替一个 5x5卷积。

具体如下图所示:

2个3x3和5x5

至于为什么使用3个3x3卷积核可以来代替7*7卷积核,推导过程与上述类似,大家可以自行绘图理解。

VGG网络结构

下面是VGG网络的结构(VGG16和VGG19都在):

VGG网络结构

  • VGG16包含了16个隐藏层(13个卷积层和3个全连接层),如上图中的D列所示
  • VGG19包含了19个隐藏层(16个卷积层和3个全连接层),如上图中的E列所示

VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的max pooling。

如果你想看到更加形象化的VGG网络,可以阅读 经典卷积神经网络(CNN)结构可视化工具 来查看高清无码的VGG网络。

VGG优缺点

VGG优点

  • VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。
  • 几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5或7x7)卷积层好:
  • 验证了通过不断加深网络结构可以提升性能。

VGG缺点

  • VGG耗费更多计算资源,并且使用了更多的参数(这里不是3x3卷积的锅),导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。VGG可是有3个全连接层啊!

PS:有的文章称:发现这些全连接层即使被去除,对于性能也没有什么影响,这样就显著降低了参数数量。

注:很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相对其他的方法,参数空间很大,最终的model有500多MB,AlexNet只有200MB,GoogLeNet更少,所以train一个vgg模型通常要花费更长的时间,所幸有公开的pretrained model让我们很方便的使用。

代码篇:VGG训练与测试

这里推荐两个开源库,训练请参考tensorflow-vgg,快速测试请参考VGG-in TensorFlow。

代码我就不介绍了,其实跟上述内容一致,跟着原理看code应该会很快。我快速跑了一下,VGG-in TensorFlow,代码亲测可用,效果很nice,就是model下载比较烦。

注:微信里不方便贴代码的超链接,但在知乎文章里已经注明

福利

贴心的Amusi已经为你准备好了VGG-in TensorFlow的测试代码、model和图像。

需要的同学可以关注CVer微信公众号,后台回复:VGG

天道酬勤,还有很多知识要学,想想都刺激~Fighting!

参考

  • 《Very Deep Convolutional Networks for Large-Scale Image Recognition》
  • 深度网络VGG理解 - CSDN博客
  • 深度学习经典卷积神经网络之VGGNet - CSDN博客
  • Netscope CNN Analyzer
  • machrisaa/tensorflow-vgg
  • VGG in TensorFlow
  • 机器学习进阶笔记之五 | 深入理解VGG\Residual Network](机器学习进阶笔记之五 | 深入理解VGG\Residual Network

原文发布于微信公众号 - CVer(CVerNews)

原文发表时间:2018-08-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏红色石头的机器学习之路

台湾大学林轩田机器学习基石课程学习笔记2 -- Learning to Answer Yes/No

上节课,我们主要简述了机器学习的定义及其重要性,并用流程图的形式介绍了机器学习的整个过程:根据模型H,使用演算法A,在训练样本D上进行训练,得到最好的h,其对应...

28800
来自专栏机器人网

从零开始,了解元学习

传统的机器学习研究模式是:获取特定任务的大型数据集,然后用这个数据集从头开始训练模型。很明显,这和人类利用以往经验,仅仅通过少量样本就迅速完成学习的情况相差甚远...

13420
来自专栏目标检测和深度学习

入门 | 从零开始,了解元学习

9910
来自专栏ATYUN订阅号

在不同的任务中,我应该选择哪种机器学习算法?

当开始研究数据科学时,我经常面临一个问题,那就是为我的特定问题选择最合适的算法。在本文中,我将尝试解释一些基本概念,并在不同的任务中使用不同类型的机器学习算法。...

34430
来自专栏机器之心

入门 | 从零开始,了解元学习

38790
来自专栏机器学习养成记

基于随机森林识别特征重要性(翻译)

博主Slav Ivanov 的文章《Identifying churn drivers with Random Forests 》部分内容翻译。博主有一款自己的...

60780
来自专栏技术随笔

[译] 用于语义分割的全卷积网络FCN(UC Berkeley)题目:用于语义分割的全卷积网络摘要1. 引言2. 相关工作3. 全卷积网络4 分割架构5 结果6 结论附录A IU上界附录B 更多的结果

42270
来自专栏智能算法

初识支持向量机原理

支持向量机作为机器学习中最为难于理解的算法,小编将以三篇的篇幅去讲解小编自己理解的SVM算法。主要包括:初识支持向量机原理、SVM如何解决线性不可分、SVM实践...

36280
来自专栏MelonTeam专栏

【译】关于深度神经网络必须知道的一些技巧(上)

翻译自魏秀参博士的文章:Must Know Tips/Tricks in Deep Neural Networks ? | 深度神经网络,特别是卷积...

43160
来自专栏杂文共赏

蚂蚁金服论文

通常,图表征学习的目标是学习一个函数:f(\mathcal{X},\mathcal{G}) ,利用\mathcal{G}空间中附加的图结构,而不是传统的只考虑f...

59670

扫码关注云+社区

领取腾讯云代金券