VGG详解:小卷积核与暴力堆层

author: abinng date: 2026-01-21 22:28 createDate:2025-12-17 15:53

背景

与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程类似,神经网络架构的设计也逐渐变得更加抽象。研究人员开始从单个神经元的角度思考问题,发展到整个层,现在又转向块,重复层的模式。

使用块的想法首先出现在牛津大学的视觉几何组(visual geometry group)的_VGG网络_中。通过使用循环和子程序,可以很容易地在任何现代深度学习框架的代码中实现这些重复的架构。

VGG在2014年的ImageNet大规模视觉识别挑战(ILSVRC -2014)中获得了亚军,并不是VGG不够强,当年获得冠军的是GoogLeNet,虽然其屈居亚军,但是由于其规律的设计、简洁可堆叠的卷积块,且在其他数据集上都有着很好的表现,从而被人们广泛使用,从这点来说还是超过了GoogLeNet

人们通常说的VGG是指VGG-16(13层卷积层+3层全连接层),与AlexNet相比,深度更深,参数更多(1.38亿),效果和可移植性更好

结构

AlexNet对比很容易可以看出VGG的可堆叠卷积块 file-20251229185224592

以下为VGG的各种结构,按列分VGG-11、VGG-13、VGG-16、VGG-19(源自VGG论文) file-20251229185224577 经典卷积神经网络的基本组成部分是下面的这个序列:

  1. 带填充以保持分辨率的卷积层;
  2. 非线性激活函数,如ReLU;
  3. 汇聚层,如最大汇聚层。 而一个VGG块与之类似,由一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层。

VGG特点:

  • vgg-block内的卷积层都是同结构的,意味着输入和输出的尺寸一样,且卷积层可以堆叠复用,具体是通过相同的卷积操作实现的,例如经过填充步幅的卷积核,输出尺寸是一样的,也就是边长为尺寸大小
  • 池化层都得上一层的卷积层特征缩减一半,使得尺寸缩减很规整,224-112-56-28-14-7,通过相同的最大池化操作(size为2 stride为2)实现的,例如经过大小填充步幅的最大池化操作,得出边长为尺寸大小
  • 深度较深、参数量够大,使得训练模型分类效果优秀,但是资源需求大
  • 较小的filter size/kernel size,这里全局都是大小 更直观的: file-20251229185224568

参数计算:

依旧,运用了公式:

file-20251229185224573! file-20251229185224543!file-20251229185224559 file-20251229185224539 file-20251229185224532

权重初始化

为什么权重初始化

初始化权重的原因:

  • 不良的初始化,极易造成梯度消失or梯度爆炸
  • 如果权重初始化得太远离最优解,模型需要更多时间来调整这些权重以达到最佳性能。而一个好的初始化策略可以使权重开始时就更接近最优解,从而加快训练过程。
  • 可能让模型陷入局部最小值出不去

从反向传播中理解,梯度下降法反向传播的一个公式

好了回忆完了,所以我们知道:

  • 很小时,为梯度消失
  • 很大时,为梯度爆炸 而从上面的公式可以知道,的大小就能影响梯度 当网络的层数比较深的情况下,如VGG,GoogLeNet
  • 当权重比1大一点,随着连乘,就会爆炸式增长
  • 当权重比1小一点,随着连乘,就会指数级减少
1
2
3
4
5
6
7
8
9
10
11
12
13
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(
m.weightm,
mode="fan_out",
nonlinearity='relu'
)
if m.bias is not None:
nn.init.constant_(m.bias, 0)
elif isinstance(m, nn.Linear):
nn.init.normal_(m.weight, 0, 0.01)
if m.bias is not None:
nn.init.constant_(m.bias, 0)

代码

GitHub - abinng/Blog-code: 用于存放我博客中的代码

进入后右上角可以给仓库一个Star哦~(´▽`ʃ♡ƪ)