VGG 网络结构
这篇主要解释 VGG 为什么反复堆叠 3 x 3 小卷积核。核心结论是:多个小卷积核可以获得和大卷积核相同的感受野,同时减少参数量,并引入更多非线性变换。
VGG详解
VGG 由牛津大学 Visual Geometry Group 在 2014 年提出,在当年 ImageNet 的定位任务中排名第一、分类任务中排名第二。
原论文地址:Very Deep Convolutional Networks for Large-Scale Image Recognition
VGG网络的创新点:通过堆叠多个小卷积核来替代大尺度卷积核,可以减少训练参数,同时能保证相同的感受野。
论文中提到,可以通过堆叠两个3×3的卷积核替代5x5的卷积核,堆叠三个3×3的卷积核替代7x7的卷积核。
CNN感受野
在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。
通俗的解释是,输出feature map上的一个单元 对应 输入层上的区域大小。
以下图为例,输出层 layer3 中一个单元 对应 输入层 layer2 上区域大小为2×2(池化操作),对应输入层 layer1 上大小为5×5
(可以这么理解,layer2中 2×2区域中的每一块对应一个3×3的卷积核,又因为 stride=2,所以layer1的感受野为5×5)
感受野的计算公式为:
F(i)=(F(i+1)−1)×Stride +Ksize
- F(i) 为第 i 层感受野
- Stride 为第 i 层的步距
- Ksize 为 卷积核 或 池化核 尺寸
即为:下层感受野 =(上层感受野 - 1)x 步距 + 卷积核尺寸
以上图为例:
- Feature map: F ( 3 ) = 1
- Pool1:F ( 2 ) = ( 1 − 1 ) × 2 + 2 = 2
- Conv1: F ( 1 ) = ( 2 − 1 ) × 2 + 3 = 5
小卷积核
现在,我们来验证下VGG论文中的两点结论:
感受野是否相同
两个 3 x 3 卷积的感受野等于一个 5 x 5 卷积,三个 3 x 3 卷积的感受野等于一个 7 x 7 卷积。
(注:VGG网络中卷积的Stride默认为1)
- Feature map: F = 1 F=1F=1
- Conv3x3(3): F = ( 1 − 1 ) × 1 + 3 = 3
- Conv3x3(2): F = ( 3 − 1 ) × 1 + 3 = 5 (5×5卷积核感受野)
- Conv3x3(1): F = ( 5 − 1 ) × 1 + 3 = 7 (7×7卷积核感受野)
参数是否更少
注:CNN参数个数 = 卷积核尺寸×卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度
现假设 输入特征矩阵深度 = 输出特征矩阵深度 = C
- 使用7×7卷积核所需参数个数:
- 堆叠三个3×3的卷积核所需参数个数:$3×3×C×C+3×3×C×C+3×3×C×C=27C^2$
VGG-16
VGG网络有多个版本,一般常用的是VGG-16模型,其网络结构如下如所示:
图中是针对D层来写的
稍作计算可以发现,经3×3卷积的特征矩阵的尺寸是不改变的:


VGG-16 有约 1.38 亿个参数,大部分集中在全连接层。常见实现中的卷积与池化参数如下:
- CONV = 3×3 filters, s = 1, same
- MAX-POOL = 2×2, s = 2

VGG 的结构很规整,也因此容易复现。它的问题同样明显:参数量大、计算开销高。后续网络虽然不再照搬这套堆叠方式,但“小卷积核逐层加深网络”的思路保留了下来。




