目录

深度卷积神经网络(AlexNet)是什么?

一、AlexNet 的核心创新

1. 深度架构

2. ReLU 激活函数

3. 数据增强

4. Dropout 正则化

5. GPU 并行计算

6. 局部响应归一化(LRN)

二、AlexNet 的网络结构

三、AlexNet 的革命性影响

AlexNet的架构图

深度卷积神经网络(AlexNet)和卷积神经网络(CNN)的区别

一、历史背景:从浅层到深度

二、架构设计:从简单到复杂

三、训练技术:从基础到创新

四、应用效果:从实验到实用

完整代码

实验结果


深度卷积神经网络(AlexNet)是什么?

AlexNet 是 2012 年由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 提出的深度卷积神经网络(DCNN),它在当年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中以15.3% 的 Top-5 错误率夺冠,大幅超越第二名(26.2%),标志着深度学习在计算机视觉领域的突破性成功,并引发了 AI 领域的革命。以下是其核心特点、架构和影响的详解:

一、AlexNet 的核心创新

1. 深度架构
  • 8 层网络:5 个卷积层 + 3 个全连接层,总参数约 6000 万(当时史无前例)。
  • 突破传统浅层网络限制:此前 CNN(如 LeNet-5)仅 7 层,AlexNet 证明深度对模型能力的关键作用。
2. ReLU 激活函数
  • 首次大规模使用ReLU(Rectified Linear Unit)f(x) = \max(0, x)解决了 Sigmoid/Tanh 的梯度消失问题,训练速度提升 6 倍。
3. 数据增强
  • 通过随机裁剪、水平翻转、颜色扰动等方法扩充训练数据,显著减少过拟合。 示例:从原图随机裁剪 224×224 区域,每个图像生成数百万变体。
4. Dropout 正则化
  • 在全连接层引入Dropout(随机丢弃 50% 神经元),防止过拟合,提升泛化能力。
  • 该技术已成为深度学习标配。
5. GPU 并行计算
  • 利用双 NVIDIA GTX 580 GPU并行训练(每个 GPU 负责部分层),将训练时间从数周缩短至数天。
  • 开创了深度学习与 GPU 硬件协同发展的模式。
6. 局部响应归一化(LRN)
  • 通过相邻通道间的竞争机制增强泛化能力(后续被 Batch Normalization 替代)。

二、AlexNet 的网络结构

输入层 (224×224×3)
  ↓
卷积层1: 96个11×11卷积核,步长4 → ReLU → LRN → 最大汇聚(3×3,步长2)
  ↓
卷积层2: 256个5×5卷积核,步长1 → ReLU → LRN → 最大汇聚(3×3,步长2)
  ↓
卷积层3: 384个3×3卷积核,步长1 → ReLU
  ↓
卷积层4: 384个3×3卷积核,步长1 → ReLU
  ↓
卷积层5: 256个3×3卷积核,步长1 → ReLU → 最大汇聚(3×3,步长2)
  ↓
全连接层1: 4096神经元 → ReLU → Dropout(0.5)
  ↓
全连接层2: 4096神经元 → ReLU → Dropout(0.5)
  ↓
全连接层3: 1000神经元 (对应ImageNet的1000个类别)
  ↓
Softmax层: 输出类别概率分布
 

关键点

  • 双 GPU 设计:前两层卷积和全连接层在两个 GPU 上并行计算(如图)。
  • 特征图尺寸变化:通过卷积和汇聚逐步减小空间尺寸(224→55→27→13→6),同时增加通道数(3→96→256→384→256)

三、AlexNet 的革命性影响

  1. 开启深度学习时代: AlexNet 的成功证明了深度模型在大规模数据上的有效性,引发学术界和工业界对深度学习的广泛关注。

  2. 推动硬件发展: 凸显 GPU 在深度学习中的核心地位,促使 NVIDIA 等公司加大对 AI 芯片的研发投入。

  3. 改变计算机视觉研究范式: 从手工特征(如 SIFT、HOG)转向端到端的深度神经网络学习,后续 VGG、ResNet 等模型均基于此演进。

  4. 拓展应用边界: 为目标检测(R-CNN)、语义分割(FCN)、人脸识别等任务奠定基础,推动 AI 在医疗、自动驾驶等领域的应用。

AlexNet的架构图

深度卷积神经网络(AlexNet)和卷积神经网络(CNN)的区别

历史背景、架构设计、训练技术、应用效果四个维度对比 AlexNet 与传统 CNN 的核心区别:

一、历史背景:从浅层到深度

维度 传统 CNN(如 LeNet-5, 1998) AlexNet(2012)
诞生时间 1990 年代(早于深度学习热潮) 深度学习复兴时期(ImageNet 竞赛后)
数据规模 小规模数据集(如 MNIST,6 万张 28×28 手写数字) 大规模数据集(ImageNet,1400 万张 224×224 图像)
硬件支持 CPU 训练(计算资源有限) GPU 并行训练(双 GTX 580,算力提升 100 倍)
应用领域 简单任务(如手写数字识别、OCR) 复杂场景(如 ImageNet 1000 类分类)

二、架构设计:从简单到复杂

维度 传统 CNN(如 LeNet-5) AlexNet
网络深度 浅(通常≤10 层) 深(8 层,首次突破 1000 万参数)
卷积核尺寸 大卷积核(如 5×5、7×7) 混合尺寸(11×11、5×5、3×3)
通道数 少(如 LeNet 第一层 6 个通道) 多(AlexNet 第一层 96 个通道)
特征图尺寸 小(如 LeNet 最终特征图 16×16) 大(AlexNet 最终特征图 6×6×256)
池化策略 平均池化为主 最大池化为主
网络结构 简单串联 复杂分支(双 GPU 并行计算)

三、训练技术:从基础到创新

维度 传统 CNN AlexNet
激活函数 Sigmoid/Tanh(易梯度消失) ReLU(解决梯度消失,加速训练 6 倍)
正则化 少量数据增强,无 Dropout 大规模数据增强(裁剪、翻转、颜色扰动)+ Dropout(0.5)
归一化 局部响应归一化(LRN)
优化器 随机梯度下降(SGD),低学习率 SGD + 动量(0.9),自适应学习率调整
训练时间 数小时至数天 数天至数周(依赖 GPU 并行)

四、应用效果:从实验到实用

维度 传统 CNN AlexNet
准确率 在小规模数据集上表现良好(如 MNIST 99%) 在大规模数据集上突破性表现(ImageNet Top-5 错误率 15.3% vs 传统方法 26.2%)
泛化能力 对简单任务有效,复杂场景易过拟合 通过 Dropout 和数据增强,显著提升泛化能力
计算效率 CPU 可承受,但处理大图缓慢 依赖 GPU,处理速度提升 100 倍
模型影响 学术研究为主,实际应用受限 引发工业界关注,推动深度学习商业化

完整代码

"""
文件名: 7.1  深度卷积神经网络(AlexNet)
作者: 墨尘
日期: 2025/7/13
项目名: dl_env
备注: 
"""

import torch
from torch import nn
from d2l import torch as d2l
# 手动显示图像(关键)
import matplotlib.pyplot as plt
import matplotlib.text as text  # 新增:用于修改文本绘制

# -------------------------- 核心解决方案:替换减号 --------------------------
# 定义替换函数:将Unicode减号U+2212替换为普通减号-
def replace_minus(s):
    if isinstance(s, str):
        return s.replace('\u2212', '-')
    return s

# 安全重写Text类的set_text方法,避免super()错误
original_set_text = text.Text.set_text  # 保存原始方法
def new_set_text(self, s):
    s = replace_minus(s)  # 替换减号
    return original_set_text(self, s)  # 调用原始方法
text.Text.set_text = new_set_text  # 应用新方法
# -------------------------------------------------------------------------

# -------------------------- 字体配置(关键修改)--------------------------
# 解决中文显示和 Unicode 减号(U+2212)显示问题
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["text.usetex"] = True  # 使用Latex渲染
plt.rcParams["axes.unicode_minus"] = True  # 正确显示负号
plt.rcParams["mathtext.fontset"] = "cm"    # 确保数学符号(如减号)正常显示
d2l.plt.rcParams.update(plt.rcParams)      # 让 d2l 绘图工具继承字体配置
# -------------------------------------------------------------------------


if __name__ == '__main__':
    # 容量控制和预处理
    net = nn.Sequential(
        # 这里使用一个11*11的更大窗口来捕捉对象。
        # 同时,步幅为4,以减少输出的高度和宽度。
        # 另外,输出通道的数目远大于LeNet
        nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        # 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
        nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        # 使用三个连续的卷积层和较小的卷积窗口。
        # 除了最后的卷积层,输出通道的数量进一步增加。
        # 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
        nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
        nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
        nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.Flatten(),
        # 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合
        nn.Linear(6400, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        nn.Linear(4096, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        # 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
        nn.Linear(4096, 10))

    X = torch.randn(1, 1, 224, 224)
    for layer in net:
        X = layer(X)
        print(layer.__class__.__name__, 'output shape:\t', X.shape)

    # 读取数据集
    batch_size = 128
    train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)

    # 训练AlexNet
    lr, num_epochs = 0.01, 10
    d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
    # 显示图像
    plt.show(block=True)  # block=True 确保窗口阻塞,直到手动关闭

实验结果

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐