快速理解VGG网络

快速理解VGG网络

  • 简介
  • 一些有用的链接
  • 网络结构
  • VGG的特点
  • 数据增强方面
  • Layer层的设计(VGG16)
  • 参数


简介

VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。VGG是一种被广泛使用的卷积神经网络结构,其在在2014年的 ImageNet 大规模视觉识别挑战(ILSVRC -2014)中获得了亚军,不是VGG不够强,而是对手太强,因为当年获得冠军的是GoogLeNet。

通常人们说的VGG是指VGG-16(13层卷积层+ 3层全连接层)。虽然其屈居亚军,但是由于其规律的设计、简洁可堆叠的卷积块,且在其他数据集上都有着很好的表现,从而被人们广泛使用,从这点上还是超过了GoogLenet。 VGG和之前的AlexNet相比,深度更深,参数更多(1.38亿),效果和可移植性更好。

一些有用的链接

  1. 文章地址:https://arxiv.org/abs/1409.1556

网络结构

VGGNet以下6种不同结构,我们以通常所说的VGG-16(即下图D列)为例,展示其结构示意图
快速理解VGG网络_第1张图片

那么对于VGG16 来讲他的网络结构款加图就应该是下面这样的:
快速理解VGG网络_第2张图片
可见,整个网络有5个vgg-block块和5个maxpool层逐个相连,然后进入FC层,直到最后1000路softmax输出。

VGG的特点

  • vgg-block内的卷积层都是同结构的
  • 池化层都得上一层的卷积层特征缩减一半
  • 深度较深,参数量够大
  • 较小的filter size/kernel size

1.vgg-block内的卷积层都是同结构的。意味着输入和输出的尺寸一样,且卷积层可以堆叠复用,其中的实现是通过统一的size为3×3的kernel size + stride1 + padding(same)实现。 下面来看一下VGG16中其中一个单元的示意图:这个就是VGG-16中的一个vgg-block块
快速理解VGG网络_第3张图片

2.maxpool层将前一层(vgg-block层)的特征缩减一半 使得尺寸缩减的很规整,从224-112-56-28-14-7。其中是通过pool size2 + stride2实现
3.深度较深,参数量够大 较深的网络层数使得训练得到的模型分类效果优秀,但是较大的参数对训练和模型保存提出了更大的资源要求。
4.较小的filter size/kernel size,这里全局的kernel size都为3×3,相比以前的网络模型来说,尺寸足够小。

数据增强方面

VGG网络中,数据增强使用的是Multi-Scale。
这里的Multi-Scale主要是将图像放大到随机的大小,然后再裁剪到224*224 的图像。

Layer层的设计(VGG16)

多种VGG网络设计都很统一,都有相同的224×224×3的input+5个maxpool层+3层fc全连接层,区别在于中间的Vgg-block块的设计不同。 下面我们以D列中的VGG-16为例展示具体的layer设计:block和block之间通过maxpool的stride=2,pool size=2进行减半池化;block内部,为了保持卷积层间的shape一致,kernel size统一尺寸为3×3。

第1层输入层: 输入为224×224×3 三通道的图像。

第2层vgg block层: 输入为224×224×3,经过64个kernel size为3×3×3的filter,stride = 1,padding=same卷积后得到shape为224×224×64的block层(指由conv构成的vgg-block)。

第3层Max-pooling层: 输入为224×224×64,经过pool size=2,stride=2的减半池化后得到尺寸为112×112×64的池化层

第4层vgg block层: 输入尺寸为112×112×64,经128个3×3×64的filter卷积,得到112×112×128的block层。

第5层Max-pooling层:输入为112×112×128,经pool size = 2,stride = 2减半池化后得到尺寸为56×56×128的池化层。

第6层vgg block层: 输入尺寸为56×56×128,经256个3×3×128的filter卷积,得到56×56×256的block层。

第7层Max-pooling层: 输入为56×56×256,经pool size = 2,stride = 2减半池化后得到尺寸为28×28×256的池化层。

第8层vgg block层: 输入尺寸为28×28×256,经512个3×3×256的filter卷积,得到28×28×512的block层。

第9层Max-pooling层: 输入为28×28×512,经pool size = 2,stride = 2减半池化后得到尺寸为14×14×512的池化层。

第10层vgg block层: 输入尺寸为14×14×512,经512个3×3×512的filter卷积,得到14×14×512的block层。

第11层Max-pooling层: 输入为14×14×512,经pool size = 2,stride = 2减半池化后得到尺寸为7×7×512的池化层。该层后面还隐藏了flatten操作,通过展平得到7×7×512=25088个参数后与之后的全连接层相连。

第12~14层Dense层: 第12~14层神经元个数分别为4096,4096,1000。其中前两层在使用relu后还使用了Dropout对神经元随机失活,最后一层全连接层用softmax输出1000个分类。

全连接层: 除最后一层外的全连接层也都使用了丢弃率0.5的dropout

这里的主要思想:
作者提到,通过堆叠两个 3 × 3 3\times3 3×3的卷积来替代一个 5 × 5 5\times5 5×5的卷积,他们的感受野是相同的。
通过堆叠三个 3 × 3 3\times3 3×3的卷积来替代一个 7 × 7 7\times7 7×7的卷积,他们的感受野是相同的。
这里面可以给出一个感受野的计算公式:
F ( i ) = ( F ( i + 1 ) − 1 ) × S t r i d e + K s i z e F(i)=(F(i+1)-1)\times Stride + K_{size} F(i)=(F(i+1)1)×Stride+Ksize
这里的 K s i z e K_{size} Ksize代表的是Kernel size

参数

官方给出的VGG系列神经网络的参数量如下:
快速理解VGG网络_第4张图片

最后我们来计算一下VGG16 的参数量。D列的VGG-16参数量高达1.38亿。
我们再手动计算一下:
快速理解VGG网络_第5张图片
这里需要特别注意的是:除了block和block间的参数,block内卷积层之间的参数也需计算

你可能感兴趣的:(深度学习)