当前位置: 首页 > news >正文

人工智能-python-深度学习-经典神经网络AlexNet

AlexNet(详解)——从原理到 PyTorch 实现(含训练示例)

文章目录

  • AlexNet(详解)——从原理到 PyTorch 实现(含训练示例)
  • 1. 发展历史与比赛成绩
  • 2. AlexNet 的核心思想(一句话)
  • 3. 模型结构总览(概览表)
  • 4. 逐层计算举例(重点:尺寸 & 参数如何得到)
      • 例 1:Conv1 输出尺寸(两种常见约定)
      • 例 2:参数量计算(按层逐项示例)
  • 5. 关键设计点解析(为什么这些创新重要)
  • 6. PyTorch 实现(完整代码 —— 可复制粘贴)
  • 7. 训练与评估(实践步骤 + 超参数建议)
  • 8. 实验扩展(建议做的对比实验)
  • 9. 总结

简介(为什么写这篇文章)
AlexNet 是 2012 年由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 提出的卷积神经网络,它在 ILSVRC-2012 上大幅度优于当时其他方法,标志着深度学习在大规模视觉识别上的一次转折。本文目标是:讲清 AlexNet 的发展/比赛成绩、核心思想与创新、逐层结构与维度/参数计算举例,并给出一个可运行的 PyTorch 实现与训练示例
论文地址


1. 发展历史与比赛成绩

  • 作者 / 时间:Alex Krizhevsky, Ilya Sutskever, Geoffrey Hinton,发表于 NIPS 2012(论文标题 ImageNet Classification with Deep Convolutional Neural Networks)。这是 AlexNet 的权威来源。([NeurIPS 会议录][1])
  • 比赛成绩:AlexNet 在 ILSVRC-2012 上获得显著胜出 —— top-5 错误率约 15.3%,相较第二名有非常大的优势(原文和后续资料中有对比说明)。这次胜利推动了深度卷积网络在计算机视觉领域的广泛应用。([NeurIPS 会议录][1], [维基百科][2])

2. AlexNet 的核心思想(一句话)

把较深的卷积网络(比当时常见的浅网络更深)、非饱和激活(ReLU)、大量数据(ImageNet)和 GPU 加速结合起来:通过 局部感受野 + 权值共享 + 下采样(池化) 学习层次化特征,并用若干技巧(ReLU、数据增强、Dropout、局部响应归一化等)防止过拟合与加速训练,从而在大型图像分类任务上取得突破。([NeurIPS 会议录][1])


3. 模型结构总览(概览表)

说明:不同实现(paper vs Caffe vs torchvision)在输入尺寸/补零细节上略有差异,常见将输入视为 227×227×3224×224×3。下表以常见重现(Caffe/多数教程)为例,输出大小基于 227×227(或对 224×224 做微调后也可得到相同的中间尺寸)。使用 AdaptiveAvgPool2d((6,6)) 可以避免输入尺寸差异导致的维度问题(后面代码中已采用)。本文中参数量计算以常见复现(final flatten = 256×6×6)为基准。([NeurIPS 会议录][1], [多伦多大学计算机系][3])

层号层类型kernel / stride / pad输出通道输出尺度(示例)备注
输入3227×227×3(或 224×224×3)先做 scale → crop
Conv1Conv 11×11, s=4, p=211×11 / 4 / 29655×55×96ReLU → LRN → MaxPool(3,2)
Pool1MaxPool 3×3, s=227×27×96
Conv2Conv 5×5, s=1, p=2, groups=25×5 / 1 / 225627×27×256ReLU → LRN → Pool
Pool2MaxPool 3×3, s=213×13×256
Conv3Conv 3×3, s=1, p=13×3 / 1 / 138413×13×384ReLU
Conv4Conv 3×3, s=1, p=1, groups=23×3 / 1 / 138413×13×384ReLU
Conv5Conv 3×3, s=1, p=1, groups=23×3 / 1 / 125613×13×256ReLU → Pool (->6×6×256)
FC6Linear40961×1×4096Dropout(0.5)
FC7Linear40961×1×4096Dropout(0.5)
FC8Linear1000logitsSoftmax / CrossEntropyLoss

注:paper 中 conv2、conv4、conv5 的“分组连接”(groups=2)设计最初出于 GPU 内存/并行的工程实现需要(在两块 GPU 上分别计算并部分连接),现代实现用 groups 可以在单 GPU 上复现该连接方式。([NeurIPS 会议录][1], [PyTorch Forums][4])


4. 逐层计算举例(重点:尺寸 & 参数如何得到)

下面先给出常用的卷积输出公式,然后做具体示例与参数量计算。

卷积输出尺寸公式(2D,单维):

O=⌊W−K+2PS⌋+1O = \left\lfloor\frac{W - K + 2P}{S}\right\rfloor + 1 O=SWK+2P+1

其中 WWW 是输入宽(高同理),KKK 是核大小,PPP 是 padding,SSS 是 stride,OOO 是输出宽(或高)。


例 1:Conv1 输出尺寸(两种常见约定)

  • 若用 输入 227×227,kernel=11,stride=4,pad=0,则
    O=(227−11)/4+1=55O=(227-11)/4+1=55O=(22711)/4+1=55 → 输出 55×55(很多 Caffe 实现采用 227);
  • 若用 输入 224×224,但加上 pad=2(常见复现做法),kernel=11,stride=4:
    O=⌊(224−11+2×2)/4⌋+1=⌊217/4⌋+1=54+1=55O=\lfloor(224-11+2×2)/4\rfloor+1=\lfloor217/4\rfloor+1=54+1=55O=⌊(22411+2×2)/4+1=217/4+1=54+1=55
    因此许多实现通过加 pad=2 在 224 和 227 的差异上取得相同的 55×55 输出(实现细节不同但逻辑等价)。([多伦多大学计算机系][3])

例 2:参数量计算(按层逐项示例)

参数(weights)数目 = out_channels × in_channels × kernel_h × kernel_w,再加上 out_channels 个偏置项(如果有 bias)。

举几个关键层(常见复现、flatten=256×6×6):

  • Conv196×3×11×11+96=34,848+96=34,94496 \times 3 \times 11 \times 11 + 96 = 34,848 + 96 = 34,94496×3×11×11+96=34,848+96=34,944 个参数。
  • Conv2(分组):paper 实现把输入通道分到两组(每组 48),卷积核为 5×5,输出 256:
    参数 = 256×48×5×5+256=307,200+256=307,456256 \times 48 \times 5 \times 5 + 256 = 307,200 + 256 = 307,456256×48×5×5+256=307,200+256=307,456
  • Conv3384×256×3×3+384=885,120384 \times 256 \times 3 \times 3 + 384 = 885,120384×256×3×3+384=885,120
  • Conv4384×192×3×3+384=663,936384 \times 192 \times 3 \times 3 + 384 = 663,936384×192×3×3+384=663,936
  • Conv5256×192×3×3+256=442,624256 \times 192 \times 3 \times 3 + 256 = 442,624256×192×3×3+256=442,624
  • FC6(输入 256×6×6=9216):4096×9216+4096=37,752,832+4096=37,756,9284096 \times 9216 + 4096 = 37,752,832 + 4096 = 37,756,9284096×9216+4096=37,752,832+4096=37,756,928
  • FC74096×4096+4096=16,781,3124096 \times 4096 + 4096 = 16,781,3124096×4096+4096=16,781,312
  • FC81000×4096+1000=4,096,000+1000=4,097,0001000 \times 4096 + 1000 = 4,096,000 + 1000 = 4,097,0001000×4096+1000=4,096,000+1000=4,097,000

把这些加起来(各层之和)大约 60,965,224 ≈ 61M 参数(paper 给出的规模约 60M 左右,和上面的逐层分解是一致的常见复现结果)。这说明:FC 层占了绝大多数参数。([Stack Overflow][5], [NeurIPS 会议录][1])


5. 关键设计点解析(为什么这些创新重要)

  1. ReLU(Rectified Linear Unit):比 sigmoid/tanh 的非线性更简单、不饱和、反向传播梯度消失更少,训练更快、收敛更好。AlexNet 强调 ReLU 这是性能跃升的重要因素之一。([NeurIPS 会议录][1])
  2. Local Response Normalization (LRN):paper 中用于增强局部“竞争性”,帮助泛化(现在 BN 更常用了)。LRN 在 conv1/conv2 后使用以稍微提升精度(但现代工作中效果有限)。([NeurIPS 会议录][1])
  3. 分组卷积(groups=2):paper 在 conv2/conv4/conv5 采用分组连接,最初是出于 “在 2 块GTX 580 GPU 上并行训练 / 内存受限” 的工程需要(每块 GPU 处理一半的通道并部分连接)。现在可用 groups 在单卡上复现。([NeurIPS 会议录][1], [PyTorch Forums][4])
  4. 重采样/池化(overlapping pooling):AlexNet 使用 kernel=3, stride=2 的 pooling(窗口有重叠),paper 指出重叠 pooling 相比不重叠可以略微提高泛化。([NeurIPS 会议录][1])
  5. 数据增强(包括 PCA lighting):两种简单但有效的数据扩增:图像随机裁切/左右翻转 + RGB 空间的 PCA 颜色扰动(paper 提到),这些“廉价”的增强能极大扩充 effective dataset 并降低过拟合。([NeurIPS 会议录][1])
  6. Dropout(FC 层):在 FC6/FC7 使用 dropout(0.5) 有效降低过拟合,显著提高泛化。([NeurIPS 会议录][1])

6. PyTorch 实现(完整代码 —— 可复制粘贴)

下面给出一个**忠实还原(常见复现)**的 AlexNet PyTorch 实现(包括 LRN、groups、Dropout、AdaptiveAvgPool,适配不同输入尺寸)。把整个代码直接复制到你的 .py/笔记本中即可运行/微调。

# alexnet_pytorch.py
import torch
import torch.nn as nn
import torch.nn.functional as Fclass AlexNetOriginal(nn.Module):def __init__(self, num_classes=1000, dropout=0.5):super(AlexNetOriginal, self).__init__()self.features = nn.Sequential(# Conv1: 3 -> 96, kernel 11, stride 4, pad 2nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True),nn.LocalResponseNorm(size=5, alpha=1e-4, beta=0.75, k=2.0),nn.MaxPool2d(kernel_size=3, stride=2),# Conv2: 96 -> 256, kernel 5, pad 2, groups=2 (paper used 2 GPUs)nn.Conv2d(96, 256, kernel_size=5, padding=2, groups=2),nn.ReLU(inplace=True),nn.LocalResponseNorm(size=5, alpha=1e-4, beta=0.75, k=2.0),nn.MaxPool2d(kernel_size=3, stride=2),# Conv3: 256 -> 384, kernel 3, pad 1nn.Conv2d(256, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),# Conv4: 384 -> 384, kernel 3, pad 1, groups=2nn.Conv2d(384, 384, kernel_size=3, padding=1, groups=2),nn.ReLU(inplace=True),# Conv5: 384 -> 256, kernel 3, pad 1, groups=2nn.Conv2d(384, 256, kernel_size=3, padding=1, groups=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),)# ensure fixed flatten size: use adaptive pooling -> 6x6self.avgpool = nn.AdaptiveAvgPool2d((6, 6))self.classifier = nn.Sequential(nn.Dropout(p=dropout),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(p=dropout),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = self.avgpool(x)           # shape -> (N, 256, 6, 6)x = torch.flatten(x, 1)       # shape -> (N, 256*6*6)x = self.classifier(x)return x# Example: instantiate model
# model = AlexNetOriginal(num_classes=1000)
# print(model)

说明:

  • LocalResponseNorm 在 PyTorch 中可用,但在现代网络中通常被 BN(BatchNorm)替代。
  • groups=2 用于复现原论文的分组连接;在多 GPU 时可以映射到不同设备,在单 GPU 上也能按分组工作(等价于并行的两个卷积再 concat)。([NeurIPS 会议录][1], [PyTorch Forums][4])

7. 训练与评估(实践步骤 + 超参数建议)

数据准备(paper 的处理):

  1. 将训练图像缩放,使短边为 256(保持纵横比)。
  2. 从缩放图像提取随机 224×224 补丁(并随机镜像)用于训练;评估时使用中心裁剪(center crop)。
  3. 进行像素级的“lighting” PCA 扰动(paper 中提到的颜色主成分扰动)或使用更简单的 ColorJitter。([NeurIPS 会议录][1])

超参数(paper 的设置,作为起点):

  • 优化器:SGD(momentum)
  • 初始学习率:lr = 0.01(paper)
  • momentum = 0.9
  • weight_decay = 0.0005
  • batch_size = 128(如果 GPU 内存不足可降到 64/32)
  • 学习率衰减:当验证误差停滞时手动将 lr 降 ×0.1(paper 中总共减少 3 次,最终 lr≈1e-5)
  • 训练轮数:paper 大约训练 90 个 epoch(总耗时 5–6 天,用两块 GTX 580 GPU)。现实中通常用更强硬件或直接 fine-tune 预训练模型。([NeurIPS 会议录][1], [维基百科][2])

训练代码模板(伪代码,关键点):

# 伪代码概览(简化版,不含 DataLoader 构造)
model = AlexNetOriginal(num_classes=1000).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)  # 举例for epoch in range(epochs):model.train()for images, labels in train_loader:images, labels = images.to(device), labels.to(device)logits = model(images)loss = criterion(logits, labels)optimizer.zero_grad()loss.backward()optimizer.step()# 验证 & 学习率调整scheduler.step()# 记录 train/val loss 与 top-1/top-5 accuracy

评估(Top-1 / Top-5):
torch.topk 可以计算 top-k 准确率;ImageNet 采用 top-1 与 top-5 指标。

可行替代(如果你资源有限):

  • 直接使用 torchvision.models.alexnet(pretrained=True) 做 fine-tune(更快、更实用)。
  • 在 CIFAR-10 / CIFAR-100 或自定义小数据集上练习,先保证实现无误,再上大规模数据。([PyTorch Docs][6])

8. 实验扩展(建议做的对比实验)

  1. 激活函数对比:ReLU vs LeakyReLU vs ELU(训练速度与最终精度比较)。
  2. 池化方式:Overlapping MaxPool(paper) vs non-overlapping vs AveragePool。
  3. BN vs LRN:在 conv 层后替换 LRN 为 BatchNorm,观察训练稳定性与收敛速度(BN 通常更好)。
  4. Dropout 和 权重衰减的组合:研究不同 dropout 概率和 weight_decay 对泛化影响。
  5. 数据增强:比较仅随机裁剪/镜像与加入 ColorJitter / PCA lighting 的效果。
  6. 优化器/学习率策略:SGD+momentum vs Adam/AdamW vs cosine lr schedule。

做这些实验时,把对比的关键指标(train/val loss、top-1/top-5 accuracy、训练时间)画成曲线,会很直观。


9. 总结

  • AlexNet 的成功来自于“把深度网络 + ReLU + 大规模数据 + GPU + 一些工程技巧(数据增强、dropout、LRN、分组计算)”结合起来。它证明了深度卷积网络在大数据集上的巨大潜力,从而推动了后续更深、更高效模型的发展(如 VGG、GoogLeNet、ResNet 等)。([NeurIPS 会议录][1], [维基百科][2])
  • 实践建议:若只想快速上手并取得良好结果,优先选择 预训练模型 + 微调;若目标是理解与复现原论文,按本文给出的实现与训练超参做实验并记录对比会很有收获。


文章转载自:

http://Snbbkv49.wwyxb.cn
http://AwfwjHc8.wwyxb.cn
http://8jifhokc.wwyxb.cn
http://bCbz55kK.wwyxb.cn
http://ttE2RgPV.wwyxb.cn
http://qOLid2PC.wwyxb.cn
http://Ns78YLP5.wwyxb.cn
http://LaJvGyv1.wwyxb.cn
http://knuaxSXf.wwyxb.cn
http://X43AlryY.wwyxb.cn
http://MLRt1jm3.wwyxb.cn
http://WifSR303.wwyxb.cn
http://hILDG5dy.wwyxb.cn
http://dYAs1aVT.wwyxb.cn
http://YKT5Nj9b.wwyxb.cn
http://C5MZAfuG.wwyxb.cn
http://45juoZV4.wwyxb.cn
http://YFcJtpB2.wwyxb.cn
http://8pWASOLm.wwyxb.cn
http://eNV4filP.wwyxb.cn
http://IiLtrWLJ.wwyxb.cn
http://ea0o3gkZ.wwyxb.cn
http://P0TTY7AH.wwyxb.cn
http://qf70JXPl.wwyxb.cn
http://e8LxQqbh.wwyxb.cn
http://gx4Yvfb1.wwyxb.cn
http://50KA8xC9.wwyxb.cn
http://VwEbq2Z8.wwyxb.cn
http://1Mxpua5t.wwyxb.cn
http://lTRfWZuD.wwyxb.cn
http://www.dtcms.com/a/373134.html

相关文章:

  • SpringBoot集成电科金仓数据库(上):环境搭建与基础配置
  • AR 巡检与普通巡检有哪些区别,有哪些优势|阿法龙XR云平台
  • Web与Nginx网站服务二
  • [硬件电路-166]:Multisim - SPICE与Verilog语言的区别
  • 计算机毕业设计 基于Python+Django的医疗数据分析系统
  • 鸿蒙:绑定半模态页面(bindSheet)
  • 001-003 产品经理-ML应用构建-ML应用范围
  • Node中使用 fs 和 node:fs 的区别与选择
  • SYN 包在什么场景下会被丢弃
  • R 语言科研绘图 --- 其他绘图-汇总2
  • Aider AI Coding 多策略编码系统深度分析报告
  • 胜券POS:打造智能移动终端,让零售智慧运营触手可及
  • tensorflow.js 使用场景
  • 【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中
  • 安卓学习 之 用户登录界面的简单实现
  • 3 提示词(Prompt):大模型的交互语言
  • 微信小程序体验版,当打开调试模式正常访问,关闭之后无法访问
  • 虚拟机ubuntu22.04没有网
  • 【WorkManager】无法在 Direct Boot 模式下初始化
  • Prompt Engineering to Context Engineering
  • Swift 语法学习指南 - 与 Kotlin 对比
  • Redux和MobX在React Native状态管理中的优缺点对比
  • 新的一天开始2025.9.8
  • LAMPSecurity: CTF6靶场渗透
  • 服务器安装 LDOPE(MODIS 数据处理工具)
  • 动态线程池中修改核心线程数比当前线程数要少,会不会影响正在执行的线程任务
  • Axum文档 ~ 2.路由
  • 【C++】IO库
  • 常见的显示器接口技术
  • 如何在本地机器上使用LLM构建知识图谱(一)