一文读懂VGG网络
从“搭积木”到深度神经网络:一文读懂 VGG 网络
在深度学习的世界里,AlexNet 像是一颗划破夜空的流星,证明了深层神经网络的巨大潜力。但紧接着,研究人员面临了一个新问题:“我们该如何设计下一个更牛的网络?” AlexNet 虽然强,但它更像是一个精心雕琢的“孤品”,没有给后人留下一套通用的“设计图纸”。
直到 2014 年,牛津大学的 视觉几何组(VGG) 站了出来。他们不仅提出了性能更强的网络,更重要的是,他们引入了一种全新的设计哲学——“块(Block)”。
今天,我们就来聊聊这个让神经网络设计变得像“搭积木”一样简单的 VGG 网络。
🧱 核心思想:别只盯着神经元,要学会“搭积木”
在 VGG 之前,设计网络像是在砌砖,工程师要关心每一块砖(神经元)怎么放。
VGG 之后,设计网络变成了搭乐高。你不再需要关心每一层的具体细节,而是先设计好一个标准的**“模块”(Block)**,然后像搭积木一样把它们堆起来。
什么是 VGG 块(VGG Block)?
VGG 块是 VGG 网络的基本单元,它的结构非常规整,就像标准化的乐高组件:
- 卷积层套餐:连续几个 $3\times3$ 的小卷积核(填充为1,保持尺寸不变),每个后面都跟着一个 ReLU 激活函数。
- 为什么要用 $3\times3$? VGG 发现,两个 $3\times3$ 卷积堆叠的效果,等同于一个 $5\times5$ 的大卷积,但参数更少,非线性更强,效果更好!
- 降维打击:最后接一个 $2\times2$ 的最大汇聚层(步幅为2),把图片的高和宽直接减半。
代码长啥样?(以 PyTorch 为例,逻辑通用)
1 | def vgg_block(卷积层数量, 输入通道, 输出通道): |
看,是不是很简单?只要改改参数,你就能生成无数个不同规格的“积木块”。
🏗️ VGG-11:经典的“高楼”是如何建成的?
有了积木,怎么盖楼?VGG 给出了一个经典模板:VGG-11。
这个名字里的 11,指的是网络里有参数的层数总和(8个卷积层 + 3个全连接层)。它的结构非常有节奏感:
| 模块序号 | 卷积层数量 | 输出通道数 | 作用 |
|---|---|---|---|
| 块 1 | 1 | 64 | 提取基础特征,尺寸减半 |
| 块 2 | 1 | 128 | 特征加倍,尺寸再减半 |
| 块 3 | 2 | 256 | 加深网络,尺寸再减半 |
| 块 4 | 2 | 512 | 继续加深,尺寸再减半 |
| 块 5 | 2 | 512 | 深层特征提取,尺寸最后减半 |
| 全连接层 | 3 | 4096 -> 10 | 分类决策 |
数据流动的奇妙旅程:
假设你输入一张 $224 \times 224$ 的图片:
- 经过 块1,变成 $112 \times 112$;
- 经过 块2,变成 $56 \times 56$;
- …以此类推…
- 经过 块5,最终变成 $7 \times 7$ 的小方块,但厚度(通道数)达到了 512。
- 最后拉直(Flatten),送入全连接层判断是猫还是狗。
这种**“高宽减半、通道翻倍”**的节奏,成为了后来很多卷积神经网络的标准范式。
💻 实战中的“坑”与“乐”
虽然 VGG 结构优雅,但在实际动手(比如跑通 Fashion-MNIST 数据集)时,我们会遇到几个有趣的问题。
❓ 疑问一:明明叫 VGG-11,为什么打印形状时只有 8 行结果?
真相:因为你是在“宏观”视角看网络。
代码里遍历的是大积木块(5个 VGG 块 + Flatten + 全连接部分)。那 8 个卷积层其实被“藏”在了前 5 个积木块的肚子里。这就好比你清点乐高城堡,数的是“塔楼”、“城墙”这几个大件,而不是去数每一块小砖头。
❓ 疑问二:VGG 比 AlexNet 慢很多,还特别吃显存,为啥?
原因很扎心:
- 太深了:层数多,计算步骤自然多。
- 太“胖”了:尤其是最后的全连接层,参数量巨大(几百万甚至上千万参数都在那里)。
- 小卷积核堆叠:虽然 $3\times3$ 单个很小,但架不住它数量多啊!大量的矩阵运算让 GPU 忙得团团转。
❓ 疑问三:如果把图片从 224 缩小到 96,会发生什么?
后果预警:
- 程序报错:VGG 默认最后特征图是 $7\times7$(由 $224 \div 32$ 得到)。如果你用 $96$,最后变成 $3\times3$。全连接层还在等着 $7\times7$ 的数据进来,维度对不上,直接崩溃!解决办法:动态计算全连接层的输入维度。
- 速度起飞:计算量大幅减少,训练飞快。
- 精度可能微跌:对于简单任务(如Fashion-MNIST)影响不大,但对于复杂图像,细节丢失可能导致识别率下降。
🚀 进阶:从 VGG-11 到 VGG-16/19
VGG 的魅力在于可配置性。想要更强的网络?不用重写代码,只需修改配置表 conv_arch:
- VGG-16:把后面三个块的卷积层数改成 3, 3, 3。
- 配置:
((2, 64), (2, 128), (3, 256), (3, 512), (3, 512))
- 配置:
- VGG-19:把后面三个块的卷积层数改成 4, 4, 4。
- 配置:
((2, 64), (2, 128), (4, 256), (4, 512), (4, 512))
- 配置:
看,只需要改一行代码,你就拥有了当年 ImageNet 竞赛的顶级模型架构!这就是模块化设计的力量。
📝 总结
VGG 网络在深度学习历史上是一座里程碑。
- 它证明了**“深层且窄”**(多层 $3\times3$ 卷积)比“浅层且宽”更有效。
- 它确立了**“块(Block)”**的设计模式,让神经网络代码变得简洁、优雅、易读。
- 它虽然因为参数量大、计算慢,在现代移动端或实时场景中逐渐被 ResNet、MobileNet 等取代,但其设计思想至今仍在影响着我们。
下次当你设计网络时,不妨想想 VGG:别忙着砌砖,先想想你的“积木块”该怎么搭!
喜欢这篇博客吗?欢迎点赞、收藏,并在评论区分享你对 VGG 的看法!