简介
VGGNet 是牛津大学计算机视觉组(Visual Geometry Group)和谷歌 DeepMind 一起研究出来的深度卷积神经网络,因而冠名为 VGG。VGG是一种被广泛使用的卷积神经网络结构,其在在2014年的 ImageNet 大规模视觉识别挑战(ILSVRC -2014)中获得了亚军,不是VGG不够强,而是对手太强,因为当年获得冠军的是GoogLeNet。
通常人们说的VGG是指VGG-16(13层卷积层+ 3层全连接层)。虽然其屈居亚军,但是由于其规律的设计、简洁可堆叠的卷积块,且在其他数据集上都有着很好的表现,从而被人们广泛使用,从这点上还是超过了GoogLenet。 VGG和之前的AlexNet相比,深度更深,参数更多(1.38亿),效果和可移植性更好。
一些有用的链接
- 文章地址:https://arxiv.org/abs/1409.1556
网络结构
VGGNet以下6种不同结构,我们以通常所说的VGG-16(即下图D列)为例,展示其结构示意图
那么对于VGG16 来讲他的网络结构款加图就应该是下面这样的: 可见,整个网络有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块
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系列神经网络的参数量如下:
最后我们来计算一下VGG16 的参数量。D列的VGG-16参数量高达1.38亿。 我们再手动计算一下: 这里需要特别注意的是:除了block和block间的参数,block内卷积层之间的参数也需计算
|