共计 2152 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景
在 2012 年之前,计算机视觉领域主要依赖手工设计特征(如 SIFT、HOG)和浅层机器学习模型(如 SVM)。传统方法存在两个致命缺陷:
- 特征提取过程繁琐且依赖专家经验
- 对图像的多层次抽象能力不足
AlexNet 在 ImageNet 竞赛中 Top- 5 错误率从 26% 骤降至 15.3%,其突破性体现在:
- 首次证明深度卷积网络的有效性
- 使用 ReLU 解决梯度消失问题
- 引入 Dropout 防止过拟合
- 利用 GPU 实现模型并行训练
架构解析
AlexNet 的核心创新点可归纳为:
-
非线性激活:采用 ReLU 替代传统 Sigmoid,计算速度提升 6 倍且缓解梯度消失
-
正则化设计:
- Dropout 层以 0.5 概率随机失活神经元
-
数据增强通过随机裁剪 / 翻转扩充样本
-
硬件优化:
- 双 GPU 并行计算(当时显存限制的解决方案)
- 局部响应归一化 (LRN) 增强泛化能力(后被 BN 层取代)

代码实现
数据预处理
import torch
from torchvision import transforms, datasets
train_transform = transforms.Compose([transforms.RandomResizedCrop(224), # AlexNet 输入尺寸
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
train_data = datasets.CIFAR10(root='./data', train=True,
download=True, transform=train_transform)
简化版 AlexNet
import torch.nn as nn
class MiniAlexNet(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(# 卷积层 1 (224x224x3 -> 55x55x96)
nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
# 卷积层 2 (27x27x96 -> 27x27x256)
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
# 后续卷积层...
)
self.classifier = nn.Sequential(nn.Dropout(p=0.5),
nn.Linear(256*6*6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(p=0.5),
nn.Linear(4096, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
训练优化
关键超参数设置
model = MiniAlexNet().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(),
lr=0.01, # 初始学习率
momentum=0.9,
weight_decay=0.0005)
# 学习率调度器
scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
step_size=30,
gamma=0.1)
训练技巧
- 学习率策略:
- 初始值设为 0.01,每 30 个 epoch 衰减 10 倍
-
可用 CosineAnnealing 替代 StepLR
-
数据增强:
- 随机水平翻转(p=0.5)
- 颜色抖动(ColorJitter)
-
随机灰度化(RandomGrayscale)
-
早停机制:
if val_loss > best_loss + 0.01: # 容忍度 early_stop_counter += 1
避坑指南
过拟合处理
- 现象:训练集准确率持续上升但验证集波动
- 解决方案:
- 增加 Dropout 概率(0.5→0.7)
- 添加 L2 正则化(weight_decay=0.001)
- 使用 Mixup 数据增强
梯度消失预防
- 现象:深层参数更新幅度极小
- 解决方案:
- 改用 LeakyReLU(negative_slope=0.01)
- 添加 BatchNorm 层
- 梯度裁剪(grad_clip=5.0)
延伸思考
现代轻量级网络如何继承 AlexNet 思想:
- 深度可分离卷积(MobileNet)
-
将标准卷积分解为深度卷积 + 逐点卷积
-
倒残差结构(EfficientNet)
-
先升维后降维的 bottleneck 设计
-
注意力机制(Vision Transformer)
- 用全局关系建模替代局部卷积
思考题:如何设计一个参数量小于 1MB 但性能接近 AlexNet 的网络?可以从哪些维度进行优化?
(提示:通道剪枝 + 量化 + 知识蒸馏组合使用)
正文完
发表至: 未分类
近两天内
