【深度学习-Day 36】CNN的开山鼻祖:从LeNet-5到AlexNet的架构演进之路

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

深度学习系列文章目录

01-【深度学习-Day 1】为什么深度学习是未来?一探究竟AI、ML、DL关系与应用
02-【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
03-【深度学习-Day 3】搞懂微积分关键:导数、偏导数、链式法则与梯度详解
04-【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
05-【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
06-【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
07-【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
08-【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
09-【深度学习-Day 9】机器学习核心概念入门:监督、无监督与强化学习全解析
10-【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归
11-【深度学习-Day 11】Scikit-learn实战:手把手教你完成鸢尾花分类项目
12-【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析
13-【深度学习-Day 13】激活函数选型指南:一文搞懂Sigmoid、Tanh、ReLU、Softmax的核心原理与应用场景
14-【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解
15-【深度学习-Day 15】告别“盲猜”:一文读懂深度学习损失函数
16-【深度学习-Day 16】梯度下降法 - 如何让模型自动变聪明?
17-【深度学习-Day 17】神经网络的心脏:反向传播算法全解析
18-【深度学习-Day 18】从SGD到Adam:深度学习优化器进阶指南与实战选择
19-【深度学习-Day 19】入门必读:全面解析 TensorFlow 与 PyTorch 的核心差异与选择指南
20-【深度学习-Day 20】PyTorch入门:核心数据结构张量(Tensor)详解与操作
21-【深度学习-Day 21】框架入门:神经网络模型构建核心指南 (Keras & PyTorch)
22-【深度学习-Day 22】框架入门:告别数据瓶颈 - 掌握PyTorch Dataset、DataLoader与TensorFlow tf.data实战
23-【深度学习-Day 23】框架实战:模型训练与评估核心环节详解 (MNIST实战)
24-【深度学习-Day 24】过拟合与欠拟合:深入解析模型泛化能力的核心挑战
25-【深度学习-Day 25】告别过拟合:深入解析 L1 与 L2 正则化(权重衰减)的原理与实战
26-【深度学习-Day 26】正则化神器 Dropout:随机失活,模型泛化的“保险丝”
27-【深度学习-Day 27】模型调优利器:掌握早停、数据增强与批量归一化
28-【深度学习-Day 28】告别玄学调参:一文搞懂网格搜索、随机搜索与自动化超参数优化
29-【深度学习-Day 29】PyTorch模型持久化指南:从保存到部署的第一步
30-【深度学习-Day 30】从MLP的瓶颈到CNN的诞生:卷积神经网络的核心思想解析
31-【深度学习-Day 31】CNN基石:彻底搞懂卷积层 (Convolutional Layer) 的工作原理
32-【深度学习-Day 32】CNN核心组件之池化层:解密最大池化与平均池化
33-【深度学习-Day 33】从零到一:亲手构建你的第一个卷积神经网络(CNN)
34-【深度学习-Day 34】CNN实战:从零构建CIFAR-10图像分类器(PyTorch)
35-【深度学习-Day 35】实战图像数据增强:用PyTorch和TensorFlow扩充你的数据集
36-【深度学习-Day 36】CNN的开山鼻祖:从LeNet-5到AlexNet的架构演进之路


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • 深度学习系列文章目录
  • 摘要
  • 一、回顾:为何要学习经典架构?
  • 二、LeNet-5:手写数字识别的先驱
    • 2.1 时代背景与核心贡献
    • 2.2 深入剖析LeNet-5架构
    • 2.3 LeNet-5的创新与局限
      • 2.3.1 主要创新点
      • 2.3.2 历史局限性
    • 2.4 [实战] 使用PyTorch构建LeNet-5
  • 三、AlexNet:引爆深度学习革命的巨兽
    • 3.1 时代背景与核心贡献
    • 3.2 深入剖析AlexNet架构
    • 3.3 AlexNet的五大核心创新
        • (1) 使用ReLU作为激活函数
        • (2) 使用Dropout防止过拟合
        • (3) 使用数据增强(Data Augmentation)
        • (4) 使用重叠池化(Overlapping Pooling)
        • (5) 使用双GPU并行训练
    • 3.4 [实战] 使用PyTorch构建AlexNet
  • 四、从LeNet-5到AlexNet:演进的启示
    • 4.1 网络深度的重要性
    • 4.2 激活函数的变革
    • 4.3 正则化技术的胜利
    • 4.4 计算能力的驱动
  • 五、总结


摘要

卷积神经网络(CNN)是深度学习在计算机视觉领域取得巨大成功的核心。然而,任何参天大树都源于最初的种子。在如今动辄上百层的复杂网络结构背后,是那些具有开创性意义的经典模型奠定了基石。本文将带领读者穿越时空,回到CNN发展的早期,深入剖析两个里程碑式的网络架构:LeNet-5AlexNet。我们将详细解读它们的设计理念、网络结构、核心创新点及其历史贡献。通过理解这两个模型的演进,我们不仅能掌握CNN的基本设计原则,更能洞察深度学习技术发展的脉络与驱动力。无论你是初学者还是希望温故知新的进阶者,本文都将为你提供一份清晰、系统且富有洞见的学习指南。

一、回顾:为何要学习经典架构?

在前面的章节中,我们已经掌握了卷积层、池化层等CNN的核心组件,并亲手搭建了一个简单的CNN模型。我们知道,CNN通过局部连接权值共享两大特性,有效提取了图像的空间特征,并大幅减少了模型参数。

然而,仅仅将这些组件随意堆叠,并不能保证得到一个性能优异的模型。如何科学地组织这些“积木”,使其协同工作,发挥出最大效能?这正是网络架构设计的核心议题。

学习LeNet-5和AlexNet等经典架构,具有以下重要意义:

  • 理解设计思想:它们是无数研究者智慧的结晶,其设计并非偶然,而是针对特定问题(如参数数量、梯度消失、计算效率)的精妙解决方案。
  • 追溯技术源流:现代CNN中许多习以为常的技术,如ReLU激活函数、Dropout、数据增强,都是由这些经典网络首次成功应用并推广开来的。了解其诞生背景,有助于我们更深刻地理解其作用与原理。
  • 获取实践启发:这些经典模型的设计原则至今仍在指导着新模型的设计。学习它们,就像是学习大师的棋谱,能够帮助我们构建自己的“棋感”,在面对新问题时,能更有方向地设计和调试网络。

因此,研究经典架构是从“会用”到“会设计”CNN的必经之路。

二、LeNet-5:手写数字识别的先驱

LeNet-5是卷积神经网络的“开山鼻祖”之一,由“深度学习三巨头”之一的Yann LeCun在1998年提出。它的主要目标是解决手写数字识别问题,并在当时美国的银行、邮政等系统中取得了巨大成功。

2.1 时代背景与核心贡献

在20世纪90年代,如何让计算机自动识别支票上的手写数字是一个重要的商业应用场景。LeNet-5的出现,完美地解决了这一问题。

其最重要的历史贡献在于,它首次将卷积层、池化层和全连接层成功地组合在一起,完整地定义了现代CNN的基本架构范式:输入 -> 卷积 -> 池化 -> 卷积 -> 池化 -> 全连接 -> 输出。这个经典的流水线结构,至今仍是大多数CNN模型的基础。

2.2 深入剖析LeNet-5架构

LeNet-5的结构非常经典,总共包含7层(不计输入层),其中有2个卷积层、2个池化层和3个全连接层。下面我们来逐层解析。

  • 输入层 (INPUT):一个 32 t i m e s 32 32 \\times 32 32times32 的灰度图像。这个尺寸比MNIST数据集的 28 t i m e s 28 28 \\times 28 28times28 稍大,是为了让卷积核能捕捉到图像边缘的特征。
  • C1层 (卷积层)
    • 操作: 使用6个 5 t i m e s 5 5 \\times 5 5times5 的卷积核进行卷积。
    • 步幅 (Stride): S = 1 S=1 S=1
    • 填充 (Padding): P = 0 P=0 P=0
    • 输出: 得到6个 28 t i m e s 28 28 \\times 28 28times28 的特征图 (Feature Map)。计算过程: ( 32 − 5 + 2 t i m e s 0 ) / 1 + 1 = 28 (32 - 5 + 2 \\times 0) / 1 + 1 = 28 (325+2times0)/1+1=28
    • 激活函数: Sigmoid或Tanh。
  • S2层 (池化层)
    • 操作: 平均池化 (Average Pooling),窗口大小为 2 t i m e s 2 2 \\times 2 2times2
    • 步幅: S = 2 S=2 S=2
    • 输出: 6个 14 t i m e s 14 14 \\times 14 14times14 的特征图。计算过程: 28 / 2 = 14 28 / 2 = 14 28/2=14
  • C3层 (卷积层)
    • 操作: 使用16个 5 t i m e s 5 5 \\times 5 5times5 的卷积核进行卷积。
    • 输出: 16个 10 t i m e s 10 10 \\times 10 10times10 的特征图。计算过程: ( 14 − 5 ) / 1 + 1 = 10 (14 - 5) / 1 + 1 = 10 (145)/1+1=10
    • 特殊连接: 这一层的设计比较特殊,其16个输出特征图并非由S2层所有的6个特征图计算得来,而是通过一个复杂的连接表进行组合,以减少参数量。这是当时计算能力受限下的折中方案。
  • S4层 (池化层)
    • 操作: 平均池化,窗口大小为 2 t i m e s 2 2 \\times 2 2times2
    • 步幅: S = 2 S=2 S=2
    • 输出: 16个 5 t i m e s 5 5 \\times 5 5times5 的特征图。计算过程: 10 / 2 = 5 10 / 2 = 5 10/2=5
  • C5层 (卷积层/全连接层)
    • 操作: 使用120个 5 t i m e s 5 5 \\times 5 5times5 的卷积核。
    • 输出: 120个 1 t i m e s 1 1 \\times 1 1times1 的特征图。计算过程: ( 5 − 5 ) / 1 + 1 = 1 (5 - 5) / 1 + 1 = 1 (55)/1+1=1。这一层在效果上等同于一个全连接层,因为它将16个 5 t i m e s 5 5 \\times 5 5times5 的特征图全部连接了起来。
  • F6层 (全连接层)
    • 输入: C5层的120个节点。
    • 输出: 84个节点。这个84的选择与输出层的字符集有关。
    • 激活函数: Sigmoid或Tanh。
  • 输出层 (OUTPUT)
    • 操作: 一个全连接层,包含10个节点,对应0-9这10个数字的概率。当时通常使用高斯径向基函数(RBF),但现在我们更倾向于使用Softmax。

2.3 LeNet-5的创新与局限

2.3.1 主要创新点

  • 奠定CNN基本结构: 首次系统性地集成了卷积、池化和全连接层,证明了其在图像识别任务上的有效性。
  • 权值共享: 大大减少了网络参数,使得训练成为可能。
  • 池化降维: 通过池化层降低了特征图的分辨率,减少了计算量,并引入了一定的平移不变性。

2.3.2 历史局限性

  • 网络规模小: 受限于当时的计算能力,LeNet-5的网络深度和宽度都很有限,难以处理更复杂的图像分类任务。
  • 激活函数问题: 使用Sigmoid或Tanh作为激活函数,在网络较深时容易引发梯度消失问题,导致训练困难。
  • 池化方式: 使用平均池化可能会模糊特征,而现代CNN更倾向于使用能保留更显著特征的最大池化(Max Pooling)。

2.4 [实战] 使用PyTorch构建LeNet-5

下面我们用现代深度学习框架PyTorch来实现一个LeNet-5模型,这能帮助我们更直观地理解其结构。

import torch
import torch.nn as nn

class LeNet5(nn.Module):
    def __init__(self, num_classes=10):
        super(LeNet5, self).__init__()
        # 定义卷积层块
        self.conv_layers = nn.Sequential(
            # C1: 输入1通道, 输出6通道, 卷积核5x5, 步长1
            nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1),
            nn.Tanh(), # 激活函数
            # S2: 平均池化, 窗口2x2, 步长2
            nn.AvgPool2d(kernel_size=2, stride=2),
            # C3: 输入6通道, 输出16通道, 卷积核5x5, 步长1
            nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, stride=1),
            nn.Tanh(), # 激活函数
            # S4: 平均池化, 窗口2x2, 步长2
            nn.AvgPool2d(kernel_size=2, stride=2)
        )
        
        # 定义全连接层块
        self.fc_layers = nn.Sequential(
            # C5: 全连接层, 输入16*5*5=400, 输出120
            # 注意: 这里的输入维度需要根据S4的输出计算
            nn.Linear(in_features=16 * 5 * 5, out_features=120),
            nn.Tanh(), # 激活函数
            # F6: 全连接层, 输入120, 输出84
            nn.Linear(in_features=120, out_features=84),
            nn.Tanh(), # 激活函数
            # Output: 全连接层, 输入84, 输出类别数
            nn.Linear(in_features=84, out_features=num_classes)
        )

    def forward(self, x):
        # 首先通过卷积和池化层
        x = self.conv_layers(x)
        # 将多维的特征图展平 (Flatten) 以便输入全连接层
        # x.size(0) 是 batch_size
        x = x.view(x.size(0), -1)
        # 然后通过全连接层
        logits = self.fc_layers(x)
        return logits

# 创建模型实例并打印结构
model = LeNet5()
print(model)

三、AlexNet:引爆深度学习革命的巨兽

如果说LeNet-5是CNN的奠基者,那么AlexNet就是将CNN推向神坛、引爆了本轮深度学习浪潮的革命者。在2012年的ImageNet大规模视觉识别挑战赛(ILSVRC)上,AlexNet以远超第二名的惊人成绩夺冠,错误率从前一年的26.2%骤降至15.3%,一举震惊了整个计算机视觉乃至人工智能领域。

3.1 时代背景与核心贡献

ImageNet是一个包含超过1400万张图像、2万多个类别的大规模数据集。在2012年之前,主流的计算机视觉方法仍然是基于手工设计的特征(如SIFT、HOG)。AlexNet的成功,雄辩地证明了深度学习模型自动学习特征的能力远超传统方法,开启了深度学习在工业界和学术界全面爆发的新时代。

AlexNet的贡献不仅在于其卓越的性能,更在于它成功应用并推广了多种至今仍在广泛使用的关键技术。

3.2 深入剖析AlexNet架构

AlexNet比LeNet-5要深得多、宽得多,它包含5个卷积层和3个全连接层。

  • 输入层 (INPUT): 227 t i m e s 227 t i m e s 3 227 \\times 227 \\times 3 227times227times3 的彩色图像(论文中为 224 t i m e s 224 224 \\times 224 224times224,但根据计算应为 227 t i m e s 227 227 \\times 227 227times227)。
  • C1 (卷积层): 96个 11 t i m e s 11 11 \\times 11 11times11 的卷积核,步幅 S = 4 S=4 S=4。输出尺寸: ( 227 − 11 ) / 4 + 1 = 55 (227-11)/4+1 = 55 (22711)/4+1=55。得到 96 t i m e s 55 t i m e s 55 96 \\times 55 \\times 55 96times55times55 的特征图。
  • P1 (池化层): 最大池化, 3 t i m e s 3 3 \\times 3 3times3 窗口,步幅 S = 2 S=2 S=2。输出尺寸: ( 55 − 3 ) / 2 + 1 = 27 (55-3)/2+1 = 27 (553)/2+1=27。得到 96 t i m e s 27 t i m e s 27 96 \\times 27 \\times 27 96times27times27 的特征图。
  • C2 (卷积层): 256个 5 t i m e s 5 5 \\times 5 5times5 卷积核,步幅 S = 1 S=1 S=1,填充 P = 2 P=2 P=2。输出尺寸:KaTeX parse error: Undefined control sequence: \* at position 8: (27-5+2\̲*̲2)/1+1=27。得到 256 t i m e s 27 t i m e s 27 256 \\times 27 \\times 27 256times27times27 的特征图。
  • P2 (池化层): 最大池化, 3 t i m e s 3 3 \\times 3 3times3 窗口,步幅 S = 2 S=2 S=2。输出尺寸: ( 27 − 3 ) / 2 + 1 = 13 (27-3)/2+1 = 13 (273)/2+1=13。得到 256 t i m e s 13 t i m e s 13 256 \\times 13 \\times 13 256times13times13 的特征图。
  • C3 (卷积层): 384个 3 t i m e s 3 3 \\times 3 3times3 卷积核,步幅 S = 1 S=1 S=1,填充 P = 1 P=1 P=1。输出尺寸:KaTeX parse error: Undefined control sequence: \* at position 8: (13-3+2\̲*̲1)/1+1=13。得到 384 t i m e s 13 t i m e s 13 384 \\times 13 \\times 13 384times13times13 的特征图。
  • C4 (卷积层): 384个 3 t i m e s 3 3 \\times 3 3times3 卷积核,步幅 S = 1 S=1 S=1,填充 P = 1 P=1 P=1。输出尺寸: 13 t i m e s 13 13 \\times 13 13times13。得到 384 t i m e s 13 t i m e s 13 384 \\times 13 \\times 13 384times13times13 的特征图。
  • C5 (卷积层): 256个 3 t i m e s 3 3 \\times 3 3times3 卷积核,步幅 S = 1 S=1 S=1,填充 P = 1 P=1 P=1。输出尺寸: 13 t i m e s 13 13 \\times 13 13times13。得到 256 t i m e s 13 t i m e s 13 256 \\times 13 \\times 13 256times13times13 的特征图。
  • P3 (池化层): 最大池化, 3 t i m e s 3 3 \\times 3 3times3 窗口,步幅 S = 2 S=2 S=2。输出尺寸: ( 13 − 3 ) / 2 + 1 = 6 (13-3)/2+1 = 6 (133)/2+1=6。得到 256 t i m e s 6 t i m e s 6 256 \\times 6 \\times 6 256times6times6 的特征图。
  • FC6 (全连接层): 将 256 t i m e s 6 t i m e s 6 = 9216 256 \\times 6 \\times 6 = 9216 256times6times6=9216 个节点连接到4096个节点。
  • FC7 (全连接层): 4096个节点连接到4096个节点。
  • FC8 (输出层): 4096个节点连接到1000个节点(对应ImageNet的1000个类别),使用Softmax。

3.3 AlexNet的五大核心创新

AlexNet的成功并非偶然,而是多项技术突破的集大成者。

(1) 使用ReLU作为激活函数

这是AlexNet最重要的改进之一。在此之前,Sigmoid是主流选择,但其在输入值较大或较小时梯度接近于0,导致深层网络中梯度反向传播时逐层衰减,最终消失。ReLU(Rectified Linear Unit, 修正线性单元)的公式为 f ( x ) = m a x ( 0 , x ) f(x) = \\max(0, x) f(x)=max(0,x)

  • 优点:
    • 计算简单: 没有复杂的指数运算。
    • 缓解梯度消失: 在 x   0 x \> 0 x0 的区域,梯度恒为1,保证了梯度的有效传递。
    • 稀疏性: 能使一部分神经元的输出为0,增加了网络的稀疏性。
  • 实践证明: AlexNet的论文指出,使用ReLU比使用Tanh的训练速度快了6倍
(2) 使用Dropout防止过拟合

AlexNet拥有约6000万个参数,在当时的数据集规模下极易发生过拟合。为此,作者引入了Dropout技术。

  • 原理: 在训练过程中的每次前向传播时,以一定的概率 p p p(AlexNet中设为0.5)随机地“丢弃”(即输出置为0)一部分神经元。
  • 效果: 这相当于每次都在训练一个不同的、更小的子网络。在测试时,所有神经元都保留,但其输出需要乘以概率 p p p 来进行缩放。Dropout强迫网络学习更加鲁棒的特征,因为任何一个神经元都不能过分依赖于其他特定的神经元。它是一种非常高效的正则化技术。
(3) 使用数据增强(Data Augmentation)

为了扩充训练数据,对抗过拟合,AlexNet使用了大量的数据增强技巧:

  • 随机裁剪与翻转: 从原始的 256 t i m e s 256 256 \\times 256 256times256 图像中随机裁剪出 224 t i m e s 224 224 \\times 224 224times224 的区域,并进行水平翻转。这使得训练样本数量增加了 ( 256 − 224 ) 2 t i m e s 2 = 2048 (256-224)^2 \\times 2 = 2048 (256224)2times2=2048 倍。
  • 色彩抖动 (PCA Jittering): 对图像的RGB通道进行主成分分析(PCA),然后对主成分添加一个带有高斯扰动的随机值,从而改变图像的颜色和强度,增强模型对光照和颜色变化的鲁棒性。
(4) 使用重叠池化(Overlapping Pooling)

在LeNet中,池化层的步幅 S S S 通常等于池化窗口的大小 k k k,这导致相邻的池化窗口之间没有重叠。AlexNet则使用了重叠池化,即步幅小于窗口大小(如 k = 3 , S = 2 k=3, S=2 k=3,S=2)。

  • 效果: 重叠池化可以在一定程度上减少池化操作带来的信息损失,提升特征的丰富性,并且实验证明这种方式能轻微降低错误率,并使模型更难过拟合。
(5) 使用双GPU并行训练

当时的GPU(GTX 580)只有3GB显存,无法容纳整个AlexNet模型。作者创造性地将网络拆分到两个GPU上进行并行训练,一个GPU负责一部分卷积核的计算。在特定的层(如C3),两个GPU之间还会进行数据交换。这不仅解决了显存瓶颈,也加快了训练速度,是当时一项杰出的工程实践。

3.4 [实战] 使用PyTorch构建AlexNet

import torch
import torch.nn as nn

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        # 定义特征提取器 (卷积层和池化层)
        self.features = nn.Sequential(
            # C1: 输入3通道, 输出96, 卷积核11x11, 步长4, 填充0
            # 原始输入是227, (227-11)/4+1=55 -> 55x55
            nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=0),
            nn.ReLU(inplace=True), # 使用ReLU激活函数
            # P1: 最大池化, 窗口3x3, 步长2
            # (55-3)/2+1=27 -> 27x27
            nn.MaxPool2d(kernel_size=3, stride=2),
            
            # C2: 输入96, 输出256, 卷积核5x5, 步长1, 填充2
            # (27-5+2*2)/1+1=27 -> 27x27
            nn.Conv2d(96, 256, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            # P2: 最大池化, 窗口3x3, 步长2
            # (27-3)/2+1=13 -> 13x13
            nn.MaxPool2d(kernel_size=3, stride=2),
            
            # C3-C5: 连续的卷积层
            nn.Conv2d(256, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            # P3: 最大池化, 窗口3x3, 步长2
            # (13-3)/2+1=6 -> 6x6
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        
        # 定义分类器 (全连接层)
        self.classifier = nn.Sequential(
            # Dropout层, p=0.5
            nn.Dropout(p=0.5),
            # FC6: 输入256*6*6=9216, 输出4096
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            
            nn.Dropout(p=0.5),
            # FC7: 输入4096, 输出4096
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            
            # FC8: 输出层
            nn.Linear(4096, num_classes),
        )

    def forward(self, x):
        # 特征提取
        x = self.features(x)
        # 展平
        x = torch.flatten(x, 1)
        # 分类
        logits = self.classifier(x)
        return logits

# 创建模型实例并打印结构
alexnet_model = AlexNet()
print(alexnet_model)

四、从LeNet-5到AlexNet:演进的启示

对比LeNet-5和AlexNet,我们可以清晰地看到CNN架构演进的四大驱动力:

4.1 网络深度的重要性

AlexNet(8层)比LeNet-5(7层,但卷积池化部分少)更深,后续的VGG、GoogLeNet、ResNet等模型更是将网络深度推向了新的高度。事实证明,增加网络深度能够让模型学习到从低级到高级、更具层次化的特征,是提升模型性能的关键。

4.2 激活函数的变革

从Sigmoid/Tanh到ReLU的转变,是深度学习发展史上的一个关键节点。它极大地解决了深度网络的训练难题,使得构建更深的网络成为可能。

4.3 正则化技术的胜利

面对参数量激增带来的过拟合风险,以Dropout数据增强为代表的正则化技术应运而生,并被证明是训练大型模型的“必需品”。它们有效地提升了模型的泛化能力。

4.4 计算能力的驱动

从只能处理小型灰度图的CPU,到能够并行训练千万级参数模型的GPU,计算能力的飞跃是深度学习革命的物理基础。没有强大的算力,AlexNet这样“巨大”的模型根本无法实现。

五、总结

本文详细回顾了卷积神经网络发展史上的两个奠基之作:LeNet-5和AlexNet。通过对它们的剖析,我们可以得出以下核心结论:

  1. LeNet-5是CNN的蓝图:它成功确立了卷积-池化-全连接的经典架构范式,是所有现代CNN模型的思想源头,证明了通过分层特征提取解决图像问题的可行性。

  2. AlexNet是深度学习的引爆点:它不仅通过更深、更宽的网络结构在ImageNet挑战赛上取得了突破性成果,更重要的是,它将ReLUDropout数据增强重叠池化GPU训练等关键技术成功整合并推广,为后续深度学习的飞速发展铺平了道路。

  3. 演进揭示核心原则:从LeNet-5到AlexNet的演进过程,清晰地揭示了深度学习模型设计的几大趋势:追求更深的网络结构、采用更高效的激活函数、运用更强大的正则化技术以及依赖更强劲的计算能力。

  4. 学习经典,启迪未来:理解这些经典模型的设计哲学和技术细节,对于我们今天设计、调试和优化自己的神经网络具有不可替代的指导意义。它们是构建更复杂模型(如VGG, ResNet)的知识基石。


你可能感兴趣的:(深度学习入门到精通,python,pytorch,开发语言,人工智能,CNN,深度学习,大模型)