CNN架构的演进是一部精彩的创新史。1998年的LeNet有5层,能识别手写数字。2012年的AlexNet有8层,赢得ImageNet竞赛。2014年的VGGNet达到19层。2015年的ResNet突破到152层,错误率降到3.6%,超越人类。每一次突破都不仅是层数的增加,更是设计理念的创新。

1998年,Yann LeCun提出LeNet-5,用于邮政编码识别。这是第一个成功应用的CNN,虽然简单但包含了CNN的核心思想。
架构:输入(32×32) → Conv(6) → Pool → Conv(16) → Pool → FC(120) → FC(84) → Output(10)
参数量约6万,在当时的硬件上能训练。但LeNet用的是tanh激活和平均池化,与现代CNN(ReLU和最大池化)不同。
2012年ImageNet竞赛,AlexNet将错误率从26%降到15.3%,引发了深度学习热潮。
创新点:
架构:8层(5个卷积层 + 3个全连接层),6000万参数
AlexNet证明了:深度网络+大数据+GPU能在计算机视觉上取得突破。之后两年,深度学习成为计算机视觉的主流。
2014年,牛津大学的VGG团队探索了一个问题:如果用非常简单但一致的架构,把网络做得很深,会怎样?
设计原则:
VGG-16架构:
|输入 (224×224×3) ↓ [Conv3-64] × 2 → Pool [Conv3-128] × 2 → Pool [Conv3-256] × 3 → Pool [Conv3-512] × 3 → Pool [Conv3-512] × 3 → Pool ↓ FC-4096 → FC-4096 → FC-1000
VGG-16有1.38亿参数,非常大。但它证明了深度的重要性——更深的网络性能更好。VGG的规则性让它易于理解和实现,至今仍是教学和迁移学习的常用模型。
为什么用3×3卷积? 两个3×3卷积的感受野等于一个5×5卷积,但参数更少: vs. ,而且有两个ReLU非线性,表达能力更强。
VGG证明了深度有用,但训练56层的网络时,研究者发现一个奇怪现象:训练集误差比20层的网络还高。这不是过拟合(过拟合是验证集误差高),而是优化困难——梯度消失让深层网络难以训练。
2015年,何恺明团队提出ResNet(Residual Network),通过残差连接(skip connection)解决了这个问题,成功训练了152层的网络。
残差块(Residual Block)的核心思想:
普通网络:
残差网络:
注意最后的 ,这是跳跃连接(skip connection),直接将输入加到输出上。
|# PyTorch残差块实现 class ResidualBlock(nn.Module): def __init__(self, channels): super().__init__() self.conv1 = nn.Conv2d(channels, channels, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(channels) self.conv2 = nn.Conv2d(channels, channels, kernel_size=3, padding
为什么残差连接有效?
数学上,残差连接让网络学习残差 ,而不是直接学习目标函数 :
如果最优函数接近恒等映射(),那么 更容易学习。即使 学不好(梯度消失),至少有 直接传过去,保证了信息流动。
实践中,ResNet-50、ResNet-101甚至ResNet-152在ImageNet上都能训练,性能随深度提升。残差连接成为现代深度网络的标准组件。
2014年,Google提出Inception网络(GoogLeNet),思路是:与其纠结用1×1还是3×3还是5×5卷积,为什么不全都用?

Inception模块同时使用多种卷积核,然后拼接结果:
|输入 ├─ 1×1 卷积 ├─ 1×1 → 3×3 卷积 ├─ 1×1 → 5×5 卷积 └─ 3×3 MaxPool → 1×1 ↓ Concat(通道维度拼接)
1×1卷积的作用:降维。直接用3×3卷积计算量大,先用1×1卷积减少通道数,再用3×3卷积,能大幅减少计算。这叫"瓶颈层"(bottleneck)。
|class InceptionModule(nn.Module): def __init__(self, in_channels): super().__init__() # 四个分支 self.branch1 = nn.Conv2d(in_channels, 64, kernel_size=1) self.branch2 = nn.Sequential( nn.Conv2d(in_channels, 96, kernel_size=1), nn.Conv2d(96
Inception让网络能够同时捕捉不同尺度的特征。后续的Inception v2、v3、v4进一步改进,但核心思想不变。
这些经典模型的预训练权重是宝贵资源。PyTorch和TensorFlow都提供了预训练模型,你可以直接加载使用。
|import torchvision.models as models # 加载预训练的ResNet50 model = models.resnet50(pretrained=True) # 冻结所有层 for param in model.parameters(): param.requires_grad = False # 替换最后一层(ResNet50原本是1000类) num_features = model.fc.in_features model.fc = nn.Linear(num_features, 10) # 假设你的任务是10分类 # 只训练最后一层 optimizer = optim.Adam(model.fc.parameters(), lr
何时冻结vs微调:
域差异的影响:
预训练模型学到的低层特征(边缘、纹理)通用性强,高层特征(物体的部分)域相关性强。
收集和标注数据昂贵,数据增强通过变换现有数据来人工扩充训练集。
常用增强方法:
|from torchvision import transforms train_transform = transforms.Compose([ # 随机裁剪并resize到224×224 transforms.RandomResizedCrop(224), # 随机水平翻转(50%概率) transforms.RandomHorizontalFlip(), # 随机旋转±15度 transforms.RandomRotation(15), # 颜色抖动 transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=
注意事项:
数据增强是一种正则化——引入的随机性防止过拟合。ImageNet竞赛中,数据增强带来的提升往往有2-3个百分点。
架构演进的启示
从LeNet到ResNet,我们看到几个趋势:
但更深不总是更好。ResNet-1000层效果不如ResNet-152。设计网络需要平衡深度、宽度、计算量。这也是为什么2019年后,NAS(神经架构搜索)和Transformer开始兴起——自动搜索最优架构,或跳出CNN的范式。
在下一节,我们将学习目标检测——不仅识别图像中有什么物体,还要定位它们的位置。这需要新的技术:边界框回归、IoU、非极大值抑制、YOLO算法等。目标检测是计算机视觉最实用的任务之一,在自动驾驶、安防监控、医疗诊断中广泛应用。