📚 课程目录

第9课:经典网络:LeNet与AlexNet

📖 本课概述

从LeNet到AlexNet,见证了深度学习在计算机视觉的革命。本课回顾这两个里程碑网络,复现它们的架构和训练过程。

🏛️ 一、LeNet-5 (1998)

1.1 历史意义

Yann LeCun提出的LeNet-5是第一个成功的卷积神经网络,用于手写数字识别(MNIST)。它奠定了CNN的基本范式:卷积→池化→全连接。

1.2 网络架构

类型输入输出
1Conv 5×532×32×128×28×6
2AvgPool 2×228×28×614×14×6
3Conv 5×514×14×610×10×16
4AvgPool 2×210×10×165×5×16
5FC400120
6FC12084
7FC8410

🔥 二、AlexNet (2012)

2.1 历史意义

Alex Krizhevsky等人在ImageNet竞赛中以巨大优势夺冠,开启了深度学习时代。关键创新:ReLU激活、Dropout、GPU训练、数据增强。

2.2 网络架构

AlexNet包含5个卷积层和3个全连接层,约6000万参数。使用ReLU代替Sigmoid,训练速度快6倍。

2.3 PyTorch复现


import torch
import torch.nn as nn
import torch.nn.functional as F

# LeNet-5实现
class LeNet5(nn.Module):
    def __init__(self):
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(1, 6, 5),     # 32→28
            nn.Sigmoid(),
            nn.AvgPool2d(2),         # 28→14
            nn.Conv2d(6, 16, 5),    # 14→10
            nn.Sigmoid(),
            nn.AvgPool2d(2),         # 10→5
        )
        self.classifier = nn.Sequential(
            nn.Linear(16*5*5, 120),
            nn.Sigmoid(),
            nn.Linear(120, 84),
            nn.Sigmoid(),
            nn.Linear(84, 10),
        )
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        return self.classifier(x)

# AlexNet简化版
class AlexNetSimple(nn.Module):
    def __init__(self, num_classes=10):
        super().__init__()
        self.features = nn.Sequential(
            nn.Conv2d(1, 64, 3, padding=1), nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(64, 192, 3, padding=1), nn.ReLU(),
            nn.MaxPool2d(2),
            nn.Conv2d(192, 384, 3, padding=1), nn.ReLU(),
            nn.Conv2d(384, 256, 3, padding=1), nn.ReLU(),
            nn.Conv2d(256, 256, 3, padding=1), nn.ReLU(),
            nn.MaxPool2d(2),
        )
        self.classifier = nn.Sequential(
            nn.Linear(256*4*4, 4096), nn.ReLU(), nn.Dropout(0.5),
            nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
            nn.Linear(4096, num_classes),
        )
    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        return self.classifier(x)

# 对比
models = {"LeNet-5": LeNet5(), "AlexNet(简化)": AlexNetSimple()}
for name, model in models.items():
    x = torch.randn(1, 1, 32, 32)
    out = model(x)
    params = sum(p.numel() for p in model.parameters())
    print(f"{name}: 输入{list(x.shape)} → 输出{list(out.shape)}, 参数量={params:,}")
    
    # 训练测试
    X = torch.randn(100, 1, 32, 32)
    y = torch.randint(0, 10, (100,))
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
    loss_fn = nn.CrossEntropyLoss()
    
    for epoch in range(0, 51, 25):
        optimizer.zero_grad()
        loss = loss_fn(model(X), y)
        loss.backward()
        optimizer.step()
        if epoch % 25 == 0:
            acc = (model(X).argmax(1) == y).float().mean()
            print(f"  Epoch {epoch}: loss={loss.item():.4f}, acc={acc.item():.2%}")
🟢 运行结果 ✅验证通过 LeNet-5: 输入[1, 1, 32, 32] → 输出[1, 10], 参数量=61,706 Epoch 0: loss=2.3446, acc=8.00% Epoch 25: loss=2.3202, acc=8.00% Epoch 50: loss=2.3010, acc=8.00% AlexNet(简化): 输入[1, 1, 32, 32] → 输出[1, 10], 参数量=35,854,026 Epoch 0: loss=2.3024, acc=14.00% Epoch 25: loss=2.3019, acc=15.00% Epoch 50: loss=2.2922, acc=13.00%

🔬 三、AlexNet的关键创新

3.1 ReLU的革命

AlexNet最持久的贡献是证明了ReLU的优越性。Sigmoid/Tanh在深层网络中梯度消失严重,而ReLU在正区间梯度恒为1,使得深层训练成为可能。

3.2 GPU训练

AlexNet首次使用双GPU并行训练,训练时间从数周缩短到5-6天。这开启了GPU加速深度学习的时代。

3.3 从AlexNet到现代CNN

年份模型Top-5错误率创新
2012AlexNet16.4%ReLU, Dropout, GPU
2013ZFNet11.2%反卷积可视化
2014VGG7.3%小卷积核,更深层
2014GoogLeNet6.7%Inception模块
2015ResNet3.6%残差连接
2017SeNet2.3%通道注意力

📖 四、延伸阅读

💡 推荐资源:

📝 练习

练习1:在MNIST训练LeNet

下载MNIST数据集,训练LeNet-5,报告测试集精度。

练习2:AlexNet改进

将AlexNet的Sigmoid换为ReLU,对比训练速度。

练习3:特征可视化

提取第一个卷积层的滤波器,可视化它们学到的模式。

💡 五、经典网络设计模式

5.1 CNN的通用设计模式

从LeNet到ResNet,CNN遵循一个共同模式:

  1. 特征提取:交替使用卷积和下采样,逐步减小空间尺寸、增加通道数
  2. 全局聚合:全局平均池化,将空间信息压缩为一个向量
  3. 分类头:全连接层映射到类别空间

5.2 现代改进

🔬 深度拓展:从理论到实践

核心概念网络

理解本课内容需要将其置于更大的知识网络中。每个核心概念都不是孤立的,它们相互关联、相互支撑:

关键洞察与直觉

建立正确的直觉比记住公式更重要:

1. 维度直觉:高维空间中,数据分布与低维直觉截然不同(维度诅咒)

2. 信息瓶颈:神经网络逐层压缩信息,保留任务相关的、丢弃无关的

3. 流形假设:高维数据实际分布在低维流形上,学习即发现流形结构

4. 偏差-方差权衡:简单模型欠拟合(高偏差),复杂模型过拟合(高方差)

与其他课程的关联

本课作为CNN阶段的核心内容,与前后课程紧密关联:

关联课程关联点协同效应
前序课程提供了本课的基础知识循序渐进的理解
后续课程本课内容是后续的基础逐步构建能力
平行课程同一阶段的互补知识多角度深入理解
实战项目综合运用所有知识理论与实践结合

面试常见问题

💡 准备面试时,确保能回答以下问题:

  1. 用简单语言解释本课核心概念
  2. 画出关键算法/结构的流程图
  3. 比较不同方法的优缺点
  4. 举出实际应用场景
  5. 讨论常见误解和注意事项

进阶学习路径

掌握本课内容后,可以通过以下方式继续深入:

📐 补充:知识体系梳理

核心公式速查

将本课涉及的关键公式整理如下,方便回顾和记忆。理解每个公式背后的直觉比死记硬背更重要——试着用自然语言解释每个公式在做什么。

易混淆概念辨析

概念A概念B关键区别
参数超参数参数通过训练学习,超参数需要手动设定
训练误差泛化误差训练误差衡量拟合程度,泛化误差衡量预测能力
偏差方差偏差是系统性误差,方差是随机波动
L1正则L2正则L1产生稀疏解,L2产生平滑解
BatchNormLayerNormBN沿batch维度,LN沿特征维度

代码模板

以下是本课核心概念的标准PyTorch实现模板,可以直接用于实际项目:

💡 调试建议:当结果不符合预期时,先检查数据,再检查损失函数,最后检查模型结构。90%的问题出在前两个环节。

🏛️

成就解锁:历史传承者

从LeNet到AlexNet,你了解了CNN的革命性发展!