《Very Deep Convolutional Networks for Large-Scale Image Recognition》
- arXiv:[1409.1556] Very Deep Convolutional Networks for Large-Scale Image Recognition
- intro:ICLR 2015
- homepage:Visual Geometry Group Home Page
- VGG16的keras代码结构:https://blog.csdn.net/cai13160674275/article/details/71078554
前言
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 指的是输入和输出的通道数。很明显,27xC2小于49xC2,即减少了参数;而且3x3卷积核有利于更好地保持图像性质。
这里解释一下为什么使用2个3x3卷积核可以来代替55卷积核:*
5x5卷积看做一个小的全连接网络在5x5区域滑动,我们可以先用一个3x3的卷积滤波器卷积,然后再用一个全连接层连接这个3x3卷积输出,这个全连接层我们也可以看做一个3x3卷积层。这样我们就可以用两个3x3卷积级联(叠加)起来代替一个 5x5卷积。
具体如下图所示:
至于为什么使用3个3x3卷积核可以来代替7*7卷积核,推导过程与上述类似,大家可以自行绘图理解。
参考
3x3卷积的作用
连续使用两个3x3的卷积核的感受野相当于5x5,连续使用三个3x3的卷积核的感受野相当于7x7。 那么举例来说,使用3个3x3的卷积核而不是一个7x7的卷积核的好处是什么?有两点原因:
我们使用了3次非线性函数而不是1次,这样增加了函数的判别能力。
这样减少了参数的数量:假设三个堆叠的3x3卷积层的输入和输出的通道数都是C,参数数目为。对于一个7x7的卷积核,参数数目为。这相当于对7x7的卷积核施加了正则化。
1x1卷积的作用
增加决策函数(decision function)的非线性,因为引入了非线性激活函数。
VGG网络结构
下面是VGG网络的结构(VGG16和VGG19都在):
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多m,AlexNet只有200m,GoogLeNet更少,所以train一个vgg模型通常要花费更长的时间,所幸有公开的pretrained model让我们很方便的使用。
代码篇:VGG训练与测试
这里推荐两个开源库,训练请参考tensorflow-vgg,快速测试请参考VGG-in TensorFlow。
代码我就不介绍了,其实跟上述内容一致,跟着原理看code应该会很快。我快速跑了一下,VGG-in TensorFlow,代码亲测可用,效果很nice,就是model下载比较烦。
贴心的Amusi已经为你准备好了[VGG-in TensorFlow](VGG in TensorFlow)的测试代码、model和图像。需要的同学可以关注CVer微信公众号,后台回复:VGG。
天道酬勤,还有很多知识要学,想想都刺激~Fighting!
参考
[1409.1556] Very Deep Convolutional Networks for Large-Scale Image Recognition