跳到主要内容

经典 CNN 架构

本节定位

学经典架构不是为了背模型名字,而是为了看清一条非常重要的演进主线:

当图像任务越来越复杂时,CNN 到底是怎么一步步变强的?

看懂这条主线,你后面遇到更现代的视觉模型时,就不会只看到一堆名词。

学习目标

  • 理解 LeNet、AlexNet、VGG、ResNet 各自解决了什么问题
  • 看懂经典 CNN 的演进逻辑,而不是只记结构图
  • 理解“小卷积核堆叠”和“残差连接”为什么重要
  • 写出一个最小残差块,真正理解 ResNet 的核心想法
  • 能从工程角度判断不同架构的优缺点

一、为什么要学“经典架构”?

1.1 经典模型不是过时知识,而是视觉建模的演化史

很多初学者看 CNN 架构时容易这样学:

  • LeNet:记一个名字
  • AlexNet:再记一个名字
  • VGG:又记一个名字
  • ResNet:好像很重要

这样学很容易散。

更好的方式是把它们看成一条演化链:

  1. LeNet:证明卷积网络能做图像识别
  2. AlexNet:把深 CNN 真正做大并在大数据上打出效果
  3. VGG:把“多层小卷积核”这件事做成标准思路
  4. ResNet:解决深网络训练困难的问题

所以学经典架构的真正目标不是“知道名字”,而是知道:

每一代在补哪一个关键短板。

1.2 一个很好记的类比

你可以把经典 CNN 架构理解成“造楼”:

  • LeNet:先证明楼能盖起来
  • AlexNet:楼盖高了,而且开始真正商用
  • VGG:开始有了更统一、更可复制的施工规范
  • ResNet:解决高楼盖太高容易塌的问题

这就是它们的直觉区别。


二、LeNet:卷积网络的早期原型

2.1 LeNet 的历史位置

LeNet 最早主要用于手写数字识别。
它的重要性不在于今天还多强,而在于它很早就把这条主线定下来了:

卷积层提特征,池化层压缩,最后全连接做分类。

2.2 LeNet 的典型结构

粗略看,LeNet 就是:

输入 -> Conv -> Pool -> Conv -> Pool -> FC -> 输出

它已经具备了 CNN 的核心骨架。

2.3 LeNet 教会了我们什么?

LeNet 真正教会后来者的是:

  • 图像不应该一开始就展平
  • 局部特征提取是可行的
  • 分层特征学习是有效的

这件事今天看起来很自然,但在当时是很关键的突破。


三、AlexNet:深 CNN 真正爆发的开始

3.1 AlexNet 为什么是里程碑?

AlexNet 最著名的地方,是它在 ImageNet 上把深 CNN 的威力真正打出来了。

它的重要意义可以粗略记成:

  • 模型更深
  • 数据更大
  • GPU 真正发挥作用
  • ReLU、Dropout 等技巧开始被广泛采用

3.2 AlexNet 解决了什么?

相比早期小模型,它证明了:

只要数据、算力和训练技巧跟上,深卷积网络能显著提升图像识别能力。

3.3 AlexNet 的启发

AlexNet 不只是“变深了”,而是告诉大家:

  • 深网络是值得做的
  • GPU 训练是未来方向
  • 激活函数和正则化技巧很关键

它更像是深度视觉时代真正的起跑枪。


四、VGG:为什么“小卷积核堆叠”这么重要?

4.1 VGG 的一个核心思想

VGG 最好记的点是:

用很多个 3x3 小卷积层去堆,而不是直接上大卷积核。

4.2 为什么不用大核,反而用很多小核?

因为连续堆叠多个小卷积核有几个优点:

  1. 感受野也能变大
  2. 参数量更可控
  3. 中间能插入更多非线性

举个直觉例子:

  • 一个 7x7 卷积核:一步看很大区域
  • 三个连续 3x3 卷积:最后也能看大范围,但每一步都能加非线性

这通常更灵活。

4.3 一个参数量直觉比较

假设输入输出通道数都相同,粗略比较:

  • 一个 7x7 卷积:参数和 49 成正比
  • 一个 3x3 卷积:参数和 9 成正比

虽然堆多层并不一定总是参数更少,但“小核 + 多层”往往更容易形成更细腻的表达。

4.4 可运行示例:一个 VGG 风格小块

import torch
from torch import nn

vgg_block = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(16, 16, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2)
)

x = torch.randn(2, 3, 32, 32)
y = vgg_block(x)

print("input shape :", x.shape)
print("output shape:", y.shape)

这个块非常像经典 VGG 的思路:

  • 先连续卷积两次
  • 再池化

五、ResNet:为什么网络一深就更难训?

5.1 一个反直觉问题

按理说,网络更深,表达能力更强,效果应该更好。
但实践里人们发现:

深到一定程度后,训练反而更困难,效果也不一定更好。

这不是“模型太强导致过拟合”这么简单,而是:

  • 梯度传递更难
  • 训练优化更困难
  • 很深的网络未必容易学到“至少不变差”的映射

5.2 ResNet 的核心想法

ResNet 提出的关键是残差连接:

不直接学习 H(x),而是学习 F(x) = H(x) - x

于是输出就变成:

y = F(x) + x

5.3 这为什么有帮助?

因为模型现在可以更容易学出:

  • “这层有用就学一点新东西”
  • “这层没必要大改,就尽量保持输入信息”

换句话说:

残差连接给深网络开了一条“不要把原信息彻底搞丢”的旁路。


六、一个真正值得你手敲的最小残差块

6.1 先看代码

import torch
from torch import nn

class ResidualBlock(nn.Module):
def __init__(self, channels):
super().__init__()
self.conv1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)
self.relu = nn.ReLU()
self.conv2 = nn.Conv2d(channels, channels, kernel_size=3, padding=1)

def forward(self, x):
identity = x
out = self.conv1(x)
out = self.relu(out)
out = self.conv2(out)
out = out + identity
out = self.relu(out)
return out

block = ResidualBlock(8)
x = torch.randn(2, 8, 16, 16)
y = block(x)

print("input shape :", x.shape)
print("output shape:", y.shape)

6.2 这段代码真正重要的是哪一行?

最关键的一行就是:

out = out + identity

这就是残差连接本身。

它让网络在学新特征时,不会完全丢掉原来的输入信息。

6.3 为什么 shape 必须一致?

因为要做逐元素相加。
如果输入输出 shape 不一致,就不能直接残差相加。

这也是为什么真实 ResNet 里有时会用:

  • 1x1 conv

来做维度对齐。


七、从经典架构看一条清晰演化线

7.1 演化逻辑总结

架构核心贡献它解决的问题
LeNetCNN 骨架雏形证明卷积用于图像识别可行
AlexNet更深、更大、GPU 训练让深 CNN 真正爆发
VGG多层小卷积核堆叠提升表达力,结构更统一
ResNet残差连接解决深网络训练困难

7.2 真正该记住什么?

不是“谁第几层多少个卷积”,而是:

每一代经典架构都在为更深、更稳、更强的视觉表示学习铺路。


八、今天还要学这些经典架构吗?

8.1 要学,但不是为了原样复刻

今天你在真实项目里,可能不一定直接从 LeNet 或 AlexNet 起步。
但这些架构依然重要,因为它们教会你:

  • CNN 为什么这样长
  • 深度为什么重要
  • 小卷积核为什么流行
  • 残差为什么几乎成了标配

8.2 很多现代模型仍然继承了这些思想

哪怕今天更现代的模型已经出现,它们很多核心思想仍然能追溯到经典 CNN:

  • 分层特征
  • 通道扩张
  • 深度堆叠
  • 残差路径

九、初学者最常踩的坑

9.1 把经典架构学成“背模型名”

这样最容易忘,而且几乎没法迁移。

9.2 只看结构图,不理解为什么这样设计

一旦不理解设计动机,后面遇到新架构就很难判断变化是不是有意义。

9.3 以为 ResNet 的重点是“更深”

ResNet 的关键不是更深本身,而是:

让更深这件事变得可训练。


小结

这一节最重要的不是记住 LeNet、AlexNet、VGG、ResNet 的名字,而是抓住这条主线:

经典 CNN 架构的演进,本质上是在回答:怎样让图像网络学得更深、更稳、更有效。

理解这条线以后,后面再看更现代的视觉模型,你就能知道它是在延续哪条思想、又改进了哪里。


练习

  1. 用自己的话总结 LeNet、AlexNet、VGG、ResNet 各自最核心的一点。
  2. 把最小残差块里的 channels=8 改成 16,再看 shape 是否一致。
  3. 想一想:为什么连续多个 3x3 卷积,往往比直接一个大卷积核更受欢迎?
  4. 如果让你只记一句话来区分 VGG 和 ResNet,你会怎么说?