1. 简介
2014年,Karen Simonyan, Andrew Zisserman在《Very Deep Convolutional Networks For Large-Scale Image Recognition》提出VGG-16,夺得ILSVRC 2014的亚军。VGG代表了牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人。
VGGNet的两个特点:层数更深更宽、卷积核更小。
各个级别VGG的模型结构如下表所示,其下方为不同模型的参数数量。可以看到,虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层了。不过训练耗时的依然是卷积层,因为这部分计算量比较大。其中D,E分别为VGG16和VGG19。
VGGNet使用的全部都是
3
×
3
3 \times 3
3×3的小卷积核和
2
×
2
2 \times 2
2×2的池化核,通过不断加深网络来提升性能。其中经常出现多个完全一样的
3
×
3
3 \times 3
3×3卷积层堆叠在一起的情况。两层
3
×
3
3 \times 3
3×3的串联卷积结果相当于一个
5
×
5
5 \times 5
5×5的卷积,即最后一个像素会与周围
5
×
5
5 \times 5
5×5个像素产生关联,可以说感受野大小为
5
×
5
5 \times 5
5×5。而3层
3
×
3
3 \times 3
3×3的卷积核的串联结果则相当于1个
7
×
7
7 \times 7
7×7的卷积层。
除此之外,3个串联的
3
×
3
3 \times 3
3×3卷积层的参数数量要比一个7x7卷积层的参数数量小得多,更少的参数意味着减少过拟合,而且更重要的是3个
3
×
3
3 \times 3
3×3卷积层拥有比1个
7
×
7
7 \times 7
7×7的卷积层更多的非线性变换,使得CNN对特征的学习能力更强。
2. 网络结构
VGG拥有5个卷积段,每一个卷积段有2-3个卷积层,同时每段的结尾都会连接一个最大池化层,来缩小图片尺寸。每段内的卷积核数量都一样,越靠后的段的卷积核数量越多:
64
−
128
−
256
−
512
−
512
64-128-256-512-512
64−128−256−512−512。
Layer Conv1-1:
- 输入: 224 × 224 × 3 224 \times 224 \times 3 224×224×3
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 64 64 64
- 输出: 224 × 224 × 64 224 \times 224 \times 64 224×224×64
Layer Conv1-2:
- 输入: 224 × 224 × 64 224 \times 224 \times 64 224×224×64
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 64 64 64
- 输出: 224 × 224 × 64 224 \times 224 \times 64 224×224×64
Layer POOL-1:
- 输入: 224 × 224 × 64 224 \times 224 \times 64 224×224×64
- 卷积核: 2 × 2 2 \times 2 2×2,步长 2 2 2,padding 0 0 0,深度 64 64 64
- 输出: 112 × 112 × 64 112 \times 112 \times 64 112×112×64
Layer Conv2-1:
- 输入: 112 × 112 × 64 112 \times 112 \times 64 112×112×64
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 64 64 64
- 输出: 112 × 112 × 128 112 \times 112 \times 128 112×112×128
Layer Conv2-2:
- 输入: 112 × 112 × 128 112 \times 112 \times 128 112×112×128
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 128 128 128
- 输出: 112 × 112 × 128 112 \times 112 \times 128 112×112×128
Layer POOL-2:
- 输入: 112 × 112 × 128 112 \times 112 \times 128 112×112×128
- 卷积核: 2 × 2 2 \times 2 2×2,步长 2 2 2,padding 0 0 0,深度 128 128 128
- 输出: 56 × 56 × 128 56 \times 56 \times 128 56×56×128
Layer Conv3-1:
- 输入: 56 × 56 × 128 56 \times 56 \times 128 56×56×128
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 256 256 256
- 输出: 56 × 56 × 256 56 \times 56 \times 256 56×56×256
Layer Conv3-2:
- 输入: 56 × 56 × 256 56 \times 56 \times 256 56×56×256
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 256 256 256
- 输出: 56 × 56 × 256 56 \times 56 \times 256 56×56×256
Layer Conv3-3:
- 输入: 56 × 56 × 256 56 \times 56 \times 256 56×56×256
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 256 256 256
- 输出: 56 × 56 × 256 56 \times 56 \times 256 56×56×256
Layer POOL-3:
- 输入: 56 × 56 × 256 56 \times 56 \times 256 56×56×256
- 卷积核: 2 × 2 2 \times 2 2×2,步长 2 2 2,padding 0 0 0,深度 256 256 256
- 输出: 28 × 28 × 256 28 \times 28 \times 256 28×28×256
Layer Conv4-1:
- 输入: 28 × 28 × 256 28 \times 28 \times 256 28×28×256
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 512 512 512
- 输出: 28 × 28 × 512 28 \times 28 \times 512 28×28×512
Layer Conv4-2:
- 输入: 28 × 28 × 512 28 \times 28 \times 512 28×28×512
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 512 512 512
- 输出: 28 × 28 × 512 28 \times 28 \times 512 28×28×512
Layer Conv4-3:
- 输入: 28 × 28 × 512 28 \times 28 \times 512 28×28×512
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 512 512 512
- 输出: 28 × 28 × 512 28 \times 28 \times 512 28×28×512
Layer POOL-4:
- 输入: 28 × 28 × 512 28 \times 28 \times 512 28×28×512
- 卷积核: 2 × 2 2 \times 2 2×2,步长 2 2 2,padding 0 0 0,深度 512 512 512
- 输出: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
Layer Conv5-1:
- 输入: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 512 512 512
- 输出: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
Layer Conv5-2:
- 输入: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 512 512 512
- 输出: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
Layer Conv5-3:
- 输入: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
- 卷积核: 3 × 3 3 \times 3 3×3,步长 1 1 1,padding 1 1 1,深度 512 512 512
- 输出: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
Layer POOL-5:
- 输入: 14 × 14 × 512 14 \times 14 \times 512 14×14×512
- 卷积核: 2 × 2 2 \times 2 2×2,步长 2 2 2,padding 0 0 0,深度 512 512 512
- 输出: 7 × 7 × 512 7 \times 7 \times 512 7×7×512