从LeNet到ResNeXt:用Python和PyTorch复现10个经典CNN模型(附完整代码)
卷积神经网络(CNN)的发展历程堪称深度学习领域最精彩的进化史之一。从1998年Yann LeCun提出的5层LeNet-5,到2017年ResNeXt的32路并行残差结构,这些里程碑式的架构不仅推动了计算机视觉的进步,更揭示了神经网络设计的核心思想。本文将带您用PyTorch亲手实现10个改变游戏规则的CNN模型,通过代码解剖每个架构的关键创新点。
1. 环境配置与基础工具
在开始构建经典模型之前,我们需要搭建统一的实验环境。推荐使用Python 3.8+和PyTorch 1.12+的组合,这是目前最稳定的深度学习开发环境之一。
python复制# 基础环境安装
conda create -n torch-cnn python=3.8
conda activate torch-cnn
pip install torch torchvision torchaudio
pip install matplotlib tqdm tensorboard
对于GPU加速,建议配置CUDA 11.3及以上版本。可以通过以下代码验证环境是否正常:
python复制import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"当前设备: {torch.cuda.current_device()}")
数据加载器是所有实验的基础组件。我们使用torchvision提供的标准化数据管道:
python复制from torchvision import transforms, datasets
# 通用数据预处理
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
test_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# CIFAR-10数据集示例
train_set = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_set = datasets.CIFAR10(root='./data', train=False, download=True, transform=test_transform)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LeNet-5:CNN的起源(1998)
作为CNN的开山之作,LeNet-5虽然只有5层,但已经包含了现代CNN的所有核心要素。让我们用PyTorch还原这个经典架构:
python复制import torch.nn as nn
import torch.nn.functional as F
class LeNet5(nn.Module):
def __init__(self, num_classes=10):
super(LeNet5, self).__init__()
self.conv1 = nn.Conv2d(1, 6, kernel_size=5, stride=1)
self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(6, 16, kernel_size=5, stride=1)
self.pool2 = nn.AvgPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, num_classes)
def forward(self, x):
x = F.tanh(self.conv1(x))
x = self.pool1(x)
x = F.tanh(self.conv2(x))
x = self.pool2(x)
x = x.view(-1, 16*5*5)
x = F.tanh(self.fc1(x))
x = F.tanh(self.fc2(x))
x = self.fc3(x)
return x
关键创新点实现:
- 原始论文使用tanh激活而非ReLU
- 平均池化层包含可训练参数(现代实现已弃用)
- 全连接层占比超过85%的参数量
训练这个"古老"模型时,需要注意几个历史性设计选择:
提示:原始论文使用均方误差(MSE)作为损失函数,现代实现通常改用交叉熵损失。学习率建议设为0.01,batch size设为128以保持历史准确性。
3. AlexNet:深度学习的复兴(2012)
AlexNet在2012年ImageNet竞赛中一战成名,其PyTorch实现展示了多个突破性设计:
python复制class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 96, kernel_size=11, stride=4),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256,
