#迁移学习 (Transfer Learning):预训练模型快速适配
📂 所属阶段:第三阶段 — 核心视觉任务(进阶篇)
🔗 相关章节:数据增强 (Data Augmentation) · 目标检测理论
#1. 迁移学习原理
"""
迁移学习:利用预训练模型的特征提取能力
步骤:
1. 加载预训练模型(在 ImageNet 上训练)
2. 冻结前面的卷积层(通用特征)
3. 替换最后的全连接层(任务特定)
4. 微调(Fine-tune)最后几层
优势:
- 训练时间减少 10 倍
- 需要的数据量减少
- 准确率更高
"""
import torch
import torchvision.models as models
# 加载预训练 ResNet50
model = models.resnet50(pretrained=True)
# 冻结前面的层
for param in model.parameters():
param.requires_grad = False
# 替换最后的全连接层
num_classes = 10
model.fc = torch.nn.Linear(model.fc.in_features, num_classes)
# 只有新的 fc 层需要训练
optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)#2. 微调策略
# 策略一:只训练最后一层
for param in model.parameters():
param.requires_grad = False
model.fc.requires_grad = True
# 策略二:微调最后几层
for param in model.layer4.parameters():
param.requires_grad = True
model.fc.requires_grad = True
# 策略三:全量微调(学习率较小)
for param in model.parameters():
param.requires_grad = True
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)#3. 完整迁移学习流程
import torch
import torchvision.models as models
from torch.utils.data import DataLoader
# 1. 加载预训练模型
model = models.resnet50(pretrained=True)
model.fc = torch.nn.Linear(2048, 10)
# 2. 定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)
# 3. 训练
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
for epoch in range(10):
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")#4. 小结
迁移学习三步:
1. 加载预训练模型
2. 冻结前面的层,替换最后的层
3. 微调(Fine-tune)
效果:
- 从零训练:需要 100 小时 GPU
- 迁移学习:需要 10 小时 GPU
- 准确率提升 5-10%💡 记住:在 2026 年,从零训练 CNN 已经过时。总是从预训练模型开始。
🔗 扩展阅读

