文章目录
“千里之行,始于足下”,在深度学习的世界中,这句话更是颠扑不破的真理。
在2015年的CVPR会议上,何凯明 (Kaiming He) 和其团队提出了 Residual Neural Network (ResNet),一举打破了深度学习模型因层数增多导致性能下降的魔咒,成为深度学习领域的里程碑式进展。这篇被冠以“深度学习救星”的论文 “Deep Residual Learning for Image Recognition” ,至今获得超过 10 万次引用,成为深度学习领域最具影响力的研究之一。
为什么 ResNet 成为如此重要的成果?这要从它对 VGGNet 的改进说起。
一、背景对比:从 VGG 到 ResNet 的蜕变 🧐👶
1.1 VGGNet 的巅峰与瓶颈
在 ResNet 推出之前,VGGNet 是深度学习研究里程碑之一(VGGNet论文),通过堆叠大量简单的 3×3 卷积核 和最大池化层,达到了优雅且高效的设计。但研究者面临一个重要问题:网络越深,性能越差!
VGGNet 在 19 层和 16 层左右的深度表现出色,但超过这一范围时性能逐渐下降,主要原因包括:
- 梯度消失与梯度爆炸问题:参数更新困难,导致模型无法有效学习。
- 计算开销巨大:十分依赖硬件资源。

1.2 ResNet 的创新与突破
ResNet 引入了全新的设计概念——残差学习 (Residual Learning),这种设计通过捷径连接 (Shortcut Connection),直接将输入 “抄底牌”,绕过若干层输出,大大缓解了深度网络中的梯度消失问题。
简而言之,ResNet 并非“重新设计轮子”,而是优化了深度学习中的网络训练过程!
举个例子:假设第 (L) 层的输出是 (H(x)),正常情况下一层层累积误差,
而 ResNet 将问题简化为学习残差函数:
[ H(x) = F(x) + x ]
其中,(F(x)) 是网络需要学习的特征,( x ) 是输入,通过捷径解决模型退化问题。
ResNet 带来的结果震撼人心:
- ImageNet 冠军:ResNet-152 在 ImageNet 竞赛中以 3.57% 的 top-5 error 率 夺冠。
- 层数新高:模型深度从 VGGNet 的 19 层跃升到 152 层,这是深度学习的重大突破!
- 迁移学习神器:ResNet 在许多下游任务(包括目标检测、分割、文字识别)中表现优越,被广泛应用于工业和学术界。
二、ResNet 的独门秘技 🤓🏗️
让我们深入看看 ResNet 的主要亮点:
2.1 残差块
残差块是 ResNet 的核心组件,通过引入捷径连接,让输入直接跳跃到更深的层级。它的形式如下:
# 一个简单残差块的结构
out = F(input) + input

如果这一层的学习结果 F ( x ) F(x) F(x) 等于零,那么输出保持为 x x x,相当于这部分对网络并不过多干扰。
传统网络靠堆叠卷积层代表复杂特征,而 ResNet 使用 x x x 保持输入稳定,从而:
- 减少梯度衰减。
- 帮助网络更深层次地捕获精细特征。
2.2 模型深度的飞跃
得益于残差学习,ResNet 能够突破深度极限,训练超过 100 层深度的网络,同时保持稳定的性能,避免精度退化。

三、上手实践:用 PyTorch 实现 ResNet 识别手写数字 💻🙌
现在,我们通过 PyTorch 使用预训练的 ResNet 模型,实现手写数字 (MNIST) 的识别任务。该任务主要有以下几个步骤:
- 使用 PyTorch 提供的预训练 ResNet 模型。
- 调整网络头,适配 MNIST 数据的单通道灰度图像与 10 类分类任务。
- 执行迁移学习以加速训练。
3.1 完整代码
以下是基于 ResNet 的手写数字识别完整实现:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
# 定义设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Training on device: {device}")
# 数据预处理(适配 ResNet 224×224 的标准输入)
transform = transforms.Compose([
transforms.Resize((224, 224)), # ResNet 要求 224×224 图像
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,)) # 标准化
])
# 加载 MNIST 数据集
train_dataset = datasets.MNIST(root="./data", train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root="./data", train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False)
# 加载预训练 ResNet 模型并调整
model = models.resnet18(pretrained=True) # 使用 ResNet-18
model.conv1 = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3) # 修改输入层适配单通道
model.fc = nn.Linear(512, 10) # 修改全连接层适配 MNIST 10 类
model = model.to(device)
# 定义损失函数与优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练函数
def train_model(model, train_loader, criterion, optimizer, num_epochs=5):
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}")
# 测试函数
def test_model(model, test_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs, 1)
correct += (predicted == labels).sum().item()
total += labels.size(0)
print(f"Test Accuracy: {100 * correct / total:.2f}%")
# 运行训练与测试
train_model(model, train_loader, criterion, optimizer)
test_model(model, test_loader)
3.2 代码说明
-
预训练模型:
- 使用
torchvision.models.resnet18
加载 ResNet-18 模型。 - 修改第一层卷积支持单通道灰度图像输入。
- 调整全连接层适配 10 类分类任务。
- 使用
-
迁移学习优势:
- 训练阶段仅需少数 Epoch,快速收敛。
- 精度显著提升,测试集表现优异。
四、为什么选择 ResNet?基于实践的比较 📊🥇
特性 | ResNet | VGGNet |
---|---|---|
模型深度 | 超深(50+ 层到千层) | 中等(16~19 层) |
梯度回传稳定性 | 出色(残差机制) | 较差(深度受限) |
计算成本 | 更高(较深层) | 较低 |
迁移学习支持 | 强(预训练模型丰富) | 较强 |
ResNet 显著优于 VGGNet,尤其在深度支持与难任务适配性两方面脱颖而出。
五、总结:拥有 ResNet,从此深度学习不再遥不可及 🎯✨
ResNet 的出现不仅解决了深度模型的瓶颈,也证明了创新解决简单问题的可能性。无论是比赛冠军,还是迁移学习的性能加成,ResNet 都是深度学习实践中的“顶流”。
快试试上面的代码,让 ResNet 带你完成从菜鸟到大神的进阶之旅吧! 🌊🎉 ,如果觉得有帮助,记得点赞收藏关注哦! 😉