AlexNet 经典神经网络原理与 PyTorch 实现详解
AlexNet 是 2012 年提出的经典卷积神经网络,在 ImageNet 竞赛中取得突破性成绩。文章详细解析了 AlexNet 的发展历史、核心思想及模型结构,包括逐层尺寸与参数量计算示例。重点阐述了 ReLU 激活函数、局部响应归一化、分组卷积、Dropout 等关键设计点的作用。提供基于 PyTorch 的完整代码实现,涵盖网络定义、训练流程及超参数建议,并给出实验扩展方向,适合深度学习初学者理解卷积神经网络原理与实践。

AlexNet 是 2012 年提出的经典卷积神经网络,在 ImageNet 竞赛中取得突破性成绩。文章详细解析了 AlexNet 的发展历史、核心思想及模型结构,包括逐层尺寸与参数量计算示例。重点阐述了 ReLU 激活函数、局部响应归一化、分组卷积、Dropout 等关键设计点的作用。提供基于 PyTorch 的完整代码实现,涵盖网络定义、训练流程及超参数建议,并给出实验扩展方向,适合深度学习初学者理解卷积神经网络原理与实践。

把较深的卷积网络(比当时常见的浅网络更深)、非饱和激活(ReLU)、大量数据(ImageNet)和 GPU 加速结合起来:通过 局部感受野 + 权值共享 + 下采样(池化) 学习层次化特征,并用若干技巧(ReLU、数据增强、Dropout、局部响应归一化等)防止过拟合与加速训练,从而在大型图像分类任务上取得突破。
说明:不同实现(paper vs Caffe vs torchvision)在输入尺寸/补零细节上略有差异,常见将输入视为
227×227×3或224×224×3。下表以常见重现(Caffe/多数教程)为例,输出大小基于227×227(或对224×224做微调后也可得到相同的中间尺寸)。使用AdaptiveAvgPool2d((6,6))可以避免输入尺寸差异导致的维度问题(后面代码中已采用)。本文中参数量计算以常见复现(final flatten = 256×6×6)为基准。
| 层号 | 层类型 | kernel / stride / pad | 输出通道 | 输出尺度(示例) | 备注 |
|---|---|---|---|---|---|
| 输入 | — | — | 3 | 227×227×3(或 224×224×3) | 先做 scale → crop |
| Conv1 | Conv 11×11, s=4, p=2 | 11×11 / 4 / 2 | 96 | 55×55×96 | ReLU → LRN → MaxPool(3,2) |
| Pool1 | MaxPool 3×3, s=2 | — | — | 27×27×96 | — |
| Conv2 | Conv 5×5, s=1, p=2, groups=2 | 5×5 / 1 / 2 | 256 | 27×27×256 | ReLU → LRN → Pool |
| Pool2 | MaxPool 3×3, s=2 | — | — | 13×13×256 | — |
| Conv3 | Conv 3×3, s=1, p=1 | 3×3 / 1 / 1 | 384 | 13×13×384 | ReLU |
| Conv4 | Conv 3×3, s=1, p=1, groups=2 | 3×3 / 1 / 1 | 384 | 13×13×384 | ReLU |
| Conv5 | Conv 3×3, s=1, p=1, groups=2 | 3×3 / 1 / 1 | 256 | 13×13×256 | ReLU → Pool (->6×6×256) |
| FC6 | Linear | — | 4096 | 1×1×4096 | Dropout(0.5) |
| FC7 | Linear | — | 4096 | 1×1×4096 | Dropout(0.5) |
| FC8 | Linear | — | 1000 | logits | Softmax / CrossEntropyLoss |
注:paper 中 conv2、conv4、conv5 的'分组连接'(groups=2)设计最初出于 GPU 内存/并行的工程实现需要(在两块 GPU 上分别计算并部分连接),现代实现用
groups可以在单 GPU 上复现该连接方式。
下面先给出常用的卷积输出公式,然后做具体示例与参数量计算。
卷积输出尺寸公式(2D,单维):
O = ⌊ (W - K + 2P) / S ⌋ + 1
其中 W 是输入宽(高同理),K 是核大小,P 是 padding,S 是 stride,O 是输出宽(或高)。
参数(weights)数目 = out_channels × in_channels × kernel_h × kernel_w,再加上 out_channels 个偏置项(如果有 bias)。
举几个关键层(常见复现、flatten=256×6×6):
把这些加起来(各层之和)大约 60,965,224 ≈ 61M 参数(paper 给出的规模约 60M 左右,和上面的逐层分解是一致的常见复现结果)。这说明:FC 层占了绝大多数参数。
groups 在单卡上复现。下面给出一个**忠实还原(常见复现)**的 AlexNet PyTorch 实现(包括 LRN、groups、Dropout、AdaptiveAvgPool,适配不同输入尺寸)。把整个代码直接复制到你的 .py/笔记本中即可运行/微调。
# alexnet_pytorch.py
import torch
import torch.nn as nn
import torch.nn.functional as F
class 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 2
nn.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 1
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
# Conv4: 384 -> 384, kernel 3, pad 1, groups=2
nn.Conv2d(384, 384, kernel_size=3, padding=1, groups=2),
nn.ReLU(inplace=True),
# Conv5: 384 -> 256, kernel 3, pad 1, groups=2
nn.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 -> 6x6
self.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)。数据准备(paper 的处理):
ColorJitter。超参数(paper 的设置,作为起点):
lr = 0.01(paper)0.90.0005128(如果 GPU 内存不足可降到 64/32)×0.1(paper 中总共减少 3 次,最终 lr≈1e-5)训练代码模板(伪代码,关键点):
# 伪代码概览(简化版,不含 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(更快、更实用)。做这些实验时,把对比的关键指标(train/val loss、top-1/top-5 accuracy、训练时间)画成曲线,会很直观。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online