深度学习资源专题
Deep Learning Resources
🧭 学习路径
基础网络 → CNN → RNN/LSTM → Transformer → 前沿
(入门) (视觉) (序列) (现代NLP) (探索)
| 阶段 |
核心内容 |
时间 |
前置 |
| 🟢 入门 |
感知机、MLP、反向传播、梯度下降 |
2-3 周 |
线代 + 微积分 |
| 🟡 视觉 |
CNN、ResNet、迁移学习、目标检测 |
3-4 周 |
MLP 基础 |
| 🟠 序列 |
RNN、LSTM、GRU、Attention |
3-4 周 |
CNN 基础 |
| 🔴 现代 |
Transformer、BERT、GPT、ViT |
4-6 周 |
Attention |
| ⚫ 前沿 |
Diffusion、GNN、RLHF、多模态 |
持续 |
上述全部 |
动手实践推荐 预测建模实战指南
📚 概述
深度学习是机器学习的一个子领域,基于多层神经网络学习数据的层次化表示。自 2012 年 AlexNet 在 ImageNet 竞赛中取得突破性成果以来,深度学习已成为人工智能的核心驱动力。
核心应用领域:
- 计算机视觉(图像分类、目标检测、分割)
- 自然语言处理(机器翻译、文本生成、问答)
- 语音识别与合成
- 强化学习(游戏、机器人控制)
- 生成模型(GAN、Diffusion、VAE)
- 推荐系统
🗺️ 知识地图
graph TB
A[深度学习] --> B[基础理论]
A --> C[神经网络架构]
A --> D[训练技术]
A --> E[应用领域]
B --> B1[反向传播]
B --> B2[优化算法]
B --> B3[正则化]
B --> B4[损失函数]
C --> C1[MLP]
C --> C2[CNN]
C --> C3[RNN/LSTM]
C --> C4[Transformer]
C --> C5[Autoencoder]
D --> D1[Batch Norm]
D --> D2[Learning Rate 调度]
D --> D3[迁移学习]
D --> D4[模型压缩]
E --> E1[计算机视觉]
E --> E2[NLP]
E --> E3[语音]
E --> E4[强化学习]
📖 经典书籍
入门级
| 书名 |
作者 |
年份 |
难度 |
特点 |
| 《Deep Learning with Python》 |
François Chollet |
2021 |
⭐⭐⭐ |
Keras 作者亲笔,实战友好 |
| 《动手学深度学习》 |
李沐等 |
2023 |
⭐⭐⭐ |
免费开源,PyTorch 代码 |
| 《神经网络与深度学习》 |
Michael Nielsen |
2019 |
⭐⭐⭐ |
理论基础清晰 |
进阶级
| 书名 |
作者 |
年份 |
难度 |
特点 |
| 《Deep Learning》 |
Goodfellow et al. |
2016 |
⭐⭐⭐⭐ |
花书,理论圣经,免费在线 |
| 《Dive into Deep Learning》 |
Aston Zhang et al. |
2023 |
⭐⭐⭐⭐ |
交互式学习,代码丰富 |
| 《Understanding Deep Learning》 |
Prince |
2023 |
⭐⭐⭐⭐ |
图文并茂,讲解清晰 |
高级级
| 书名 |
作者 |
年份 |
难度 |
特点 |
| 《Pattern Recognition and Machine Learning》 |
Bishop |
2006 |
⭐⭐⭐⭐⭐ |
贝叶斯视角,数学严谨 |
| 《Probabilistic Deep Learning》 |
Beel et al. |
2020 |
⭐⭐⭐⭐⭐ |
概率深度学习 |
| 《Generative Deep Learning》 |
David Foster |
2021 |
⭐⭐⭐⭐ |
GAN、VAE、Diffusion |
🎓 在线课程
免费课程
| 课程 |
平台 |
讲师 |
时长 |
链接 |
| Deep Learning Specialization |
Coursera |
Andrew Ng |
5 门课 |
链接 |
| CS231n |
YouTube/Stanford |
Fei-Fei Li |
16 讲 |
链接 |
| CS224n |
YouTube/Stanford |
Christopher Manning |
20 讲 |
链接 |
| 深度学习 |
B 站 |
李宏毅 |
45 讲 |
链接 |
| Practical Deep Learning |
fast.ai |
Jeremy Howard |
7 周 |
链接 |
实战课程
| 课程 |
平台 |
特点 |
链接 |
| Deep Learning with PyTorch |
Udacity |
Facebook 合作 |
链接 |
| Tensorflow Developer Certificate |
Coursera |
Google 认证 |
链接 |
| Deep Learning Nanodegree |
Udacity |
项目驱动 |
链接 |
🔧 框架与工具
主流框架
| 框架 |
特点 |
Stars |
链接 |
| PyTorch |
动态图、研究首选 |
70k+ |
GitHub |
| TensorFlow |
工业部署、生态完善 |
170k+ |
GitHub |
| JAX |
函数式、高性能 |
25k+ |
GitHub |
| PaddlePaddle |
百度出品、中文友好 |
20k+ |
GitHub |
高级库
| 库 |
功能 |
Stars |
链接 |
| Lightning |
PyTorch 训练框架 |
25k+ |
GitHub |
| Hugging Face |
预训练模型库 |
100k+ |
GitHub |
| Detectron2 |
目标检测与分割 |
25k+ |
GitHub |
| MMDetection |
商汤检测工具箱 |
25k+ |
GitHub |
📊 核心概念详解
1. 神经网络基础
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleMLP(nn.Module):
"""多层感知机示例"""
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size // 2)
self.fc3 = nn.Linear(hidden_size // 2, output_size)
self.dropout = nn.Dropout(0.5)
def forward(self, x):
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = F.relu(self.fc2(x))
x = self.dropout(x)
x = self.fc3(x)
return x
# 实例化模型
model = SimpleMLP(input_size=784, hidden_size=512, output_size=10)
# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
print(f"模型参数量:{sum(p.numel() for p in model.parameters()):,}")
2. 卷积神经网络 (CNN)
class CNNForImageClassification(nn.Module):
"""图像分类 CNN"""
def __init__(self, num_classes=10):
super().__init__()
# 卷积层
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
# 池化层
self.pool = nn.MaxPool2d(2, 2)
# 批归一化
self.bn1 = nn.BatchNorm2d(32)
self.bn2 = nn.BatchNorm2d(64)
self.bn3 = nn.BatchNorm2d(128)
# 全连接层
self.fc1 = nn.Linear(128 * 4 * 4, 256)
self.fc2 = nn.Linear(256, num_classes)
self.dropout = nn.Dropout(0.5)
def forward(self, x):
# Conv Block 1
x = self.pool(F.relu(self.bn1(self.conv1(x))))
# Conv Block 2
x = self.pool(F.relu(self.bn2(self.conv2(x))))
# Conv Block 3
x = self.pool(F.relu(self.bn3(self.conv3(x))))
# 展平
x = x.view(-1, 128 * 4 * 4)
# 全连接
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
return x
# 经典 CNN 架构
# - LeNet-5 (1998): 手写数字识别
# - AlexNet (2012): ImageNet 突破
# - VGG (2014): 深度与简洁
# - ResNet (2015): 残差连接
# - EfficientNet (2019): 复合缩放
3. 循环神经网络 (RNN/LSTM)
class LSTMForSequenceClassification(nn.Module):
"""LSTM 序列分类"""
def __init__(self, vocab_size, embedding_dim, hidden_size, num_classes, num_layers=2):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=0)
self.lstm = nn.LSTM(
embedding_dim,
hidden_size,
num_layers=num_layers,
batch_first=True,
bidirectional=True,
dropout=0.3 if num_layers > 1 else 0
)
self.fc = nn.Linear(hidden_size * 2, num_classes)
def forward(self, x, lengths=None):
# x: (batch_size, seq_len)
embedded = self.embedding(x) # (batch, seq, embed)
# LSTM
lstm_out, (hidden, cell) = self.lstm(embedded)
# 连接双向隐状态
hidden_cat = torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)
# 分类
output = self.fc(hidden_cat)
return output
# 变体
# - GRU: 简化版 LSTM
# - Bi-LSTM: 双向 LSTM
# - Attention-based LSTM: 带注意力机制
class TransformerBlock(nn.Module):
"""Transformer 编码器块"""
def __init__(self, embed_dim, num_heads, ff_dim, dropout=0.1):
super().__init__()
self.attention = nn.MultiheadAttention(embed_dim, num_heads, dropout=dropout)
self.feed_forward = nn.Sequential(
nn.Linear(embed_dim, ff_dim),
nn.ReLU(),
nn.Linear(ff_dim, embed_dim)
)
self.norm1 = nn.LayerNorm(embed_dim)
self.norm2 = nn.LayerNorm(embed_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, x, mask=None):
# 自注意力(带残差连接和 LayerNorm)
attn_output, _ = self.attention(x, x, x, attn_mask=mask)
x = self.norm1(x + self.dropout(attn_output))
# 前馈网络
ff_output = self.feed_forward(x)
x = self.norm2(x + self.dropout(ff_output))
return x
class TransformerEncoder(nn.Module):
"""完整 Transformer 编码器"""
def __init__(self, vocab_size, max_seq_len, embed_dim, num_heads,
num_layers, ff_dim, num_classes):
super().__init__()
self.token_embedding = nn.Embedding(vocab_size, embed_dim)
self.position_embedding = nn.Embedding(max_seq_len, embed_dim)
self.transformer_blocks = nn.ModuleList([
TransformerBlock(embed_dim, num_heads, ff_dim)
for _ in range(num_layers)
])
self.fc = nn.Linear(embed_dim, num_classes)
def forward(self, x):
batch_size, seq_len = x.shape
positions = torch.arange(seq_len).unsqueeze(0).expand(batch_size, -1)
# 词嵌入 + 位置嵌入
embedded = self.token_embedding(x) + self.position_embedding(positions)
# Transformer 块
for block in self.transformer_blocks:
embedded = block(embedded.transpose(0, 1)).transpose(0, 1)
# 全局平均池化
pooled = embedded.mean(dim=1)
# 分类
output = self.fc(pooled)
return output
5. 训练技巧
# 1. 学习率调度器
from torch.optim.lr_scheduler import CosineAnnealingLR, ReduceLROnPlateau
scheduler = CosineAnnealingLR(optimizer, T_max=10, eta_min=1e-6)
# 或
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=3)
# 2. 梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 3. 混合精度训练
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
with autocast():
output = model(input)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
# 4. 早停机制
class EarlyStopping:
def __init__(self, patience=5, min_delta=0.001):
self.patience = patience
self.min_delta = min_delta
self.counter = 0
self.best_loss = None
self.should_stop = False
def __call__(self, val_loss):
if self.best_loss is None:
self.best_loss = val_loss
elif val_loss > self.best_loss - self.min_delta:
self.counter += 1
if self.counter >= self.patience:
self.should_stop = True
else:
self.best_loss = val_loss
self.counter = 0
early_stopper = EarlyStopping(patience=5)
# 训练循环中
for epoch in range(max_epochs):
train_loss = train_one_epoch()
val_loss = validate()
early_stopper(val_loss)
if early_stopper.should_stop:
print(f"Early stopping at epoch {epoch}")
break
6. 迁移学习
from torchvision import models
def setup_transfer_learning(num_classes, pretrained=True, freeze_backbone=True):
"""设置迁移学习模型"""
# 加载预训练模型
model = models.resnet50(pretrained=pretrained)
if freeze_backbone:
# 冻结骨干网络
for param in model.parameters():
param.requires_grad = False
# 替换最后的全连接层
num_features = model.fc.in_features
model.fc = nn.Sequential(
nn.Dropout(0.5),
nn.Linear(num_features, num_classes)
)
return model
# 使用示例
model = setup_transfer_learning(num_classes=10, freeze_backbone=True)
# 只训练新层
optimizer = torch.optim.Adam(filter(p: p.requires_grad, model.parameters()), lr=0.001)
# 训练几个 epoch 后,解冻骨干网络进行微调
def fine_tune(model, unfreeze_from_layer=None):
"""微调策略"""
# 解冻所有层
for param in model.parameters():
param.requires_grad = True
# 使用更小的学习率
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
return optimizer
7. 数据增强
from torchvision import transforms
# 图像数据增强
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(p=0.5),
transforms.RandomVerticalFlip(p=0.2),
transforms.RandomRotation(30),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
transforms.RandomAffine(degrees=0, translate=(0.1, 0.1), scale=(0.9, 1.1)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
transforms.RandomErasing(p=0.2)
])
test_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
# 高级增强 (CutMix, Mixup)
def cutmix(x, y, alpha=1.0):
"""CutMix 数据增强"""
lam = np.random.beta(alpha, alpha)
batch_size = x.size(0)
index = torch.randperm(batch_size)
bbx1, bby1, bbx2, bby2 = rand_bbox(x.size(), lam)
x[:, :, bbx1:bbx2, bby1:bby2] = x[index, :, bbx1:bbx2, bby1:bby2]
# 调整标签
lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1) / (x.size(-1) * x.size(-2)))
y = y * lam + y[index] * (1. - lam)
return x, y
8. 模型评估与可视化
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
def evaluate_model(model, dataloader, device, class_names=None):
"""全面评估模型"""
model.eval()
all_preds = []
all_labels = []
all_probs = []
with torch.no_grad():
for inputs, labels in dataloader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
probs = F.softmax(outputs, dim=1)
_, preds = torch.max(outputs, 1)
all_preds.extend(preds.cpu().numpy())
all_labels.extend(labels.cpu().numpy())
all_probs.extend(probs.cpu().numpy())
# 分类报告
print("分类报告:")
print(classification_report(all_labels, all_preds, target_names=class_names))
# 混淆矩阵
cm = confusion_matrix(all_labels, all_preds)
plt.figure(figsize=(10, 8))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix')
plt.ylabel('True Label')
plt.xlabel('Predicted Label')
plt.show()
# 计算各类别指标
from sklearn.metrics import precision_recall_fscore_support
precision, recall, f1, _ = precision_recall_fscore_support(
all_labels, all_preds, average=None
)
metrics_df = pd.DataFrame({
'Precision': precision,
'Recall': recall,
'F1-Score': f1,
'Support': np.bincount(all_labels)
}, index=class_names)
print("\n各类别指标:")
print(metrics_df)
return {
'predictions': all_preds,
'labels': all_labels,
'probabilities': all_probs,
'metrics': metrics_df
}
📝 实战项目
项目 1: 图像分类完整流程
class ImageClassificationPipeline:
"""图像分类完整流程"""
def __init__(self, model_name='resnet50', num_classes=10, pretrained=True):
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
self.model = self.setup_model(model_name, num_classes, pretrained)
self.criterion = nn.CrossEntropyLoss()
self.optimizer = None
self.scheduler = None
self.history = {'train_loss': [], 'val_loss': [], 'train_acc': [], 'val_acc': []}
def setup_model(self, model_name, num_classes, pretrained):
"""设置模型"""
if model_name == 'resnet50':
model = models.resnet50(pretrained=pretrained)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, num_classes)
elif model_name == 'efficientnet':
model = models.efficientnet_b0(pretrained=pretrained)
num_features = model.classifier[1].in_features
model.classifier[1] = nn.Linear(num_features, num_classes)
return model.to(self.device)
def train(self, train_loader, val_loader, epochs=10, lr=0.001):
"""训练模型"""
self.optimizer = torch.optim.Adam(self.model.parameters(), lr=lr)
self.scheduler = CosineAnnealingLR(self.optimizer, T_max=epochs)
for epoch in range(epochs):
# 训练
train_loss, train_acc = self.train_one_epoch(train_loader)
# 验证
val_loss, val_acc = self.validate(val_loader)
# 记录历史
self.history['train_loss'].append(train_loss)
self.history['val_loss'].append(val_loss)
self.history['train_acc'].append(train_acc)
self.history['val_acc'].append(val_acc)
print(f"Epoch {epoch+1}/{epochs}")
print(f" Train Loss: {train_loss:.4f}, Acc: {train_acc:.4f}")
print(f" Val Loss: {val_loss:.4f}, Acc: {val_acc:.4f}")
self.scheduler.step()
return self.history
def train_one_epoch(self, loader):
"""单个 epoch 训练"""
self.model.train()
running_loss = 0.0
correct = 0
total = 0
for inputs, labels in loader:
inputs, labels = inputs.to(self.device), labels.to(self.device)
self.optimizer.zero_grad()
outputs = self.model(inputs)
loss = self.criterion(outputs, labels)
loss.backward()
self.optimizer.step()
running_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
return running_loss / len(loader), correct / total
def validate(self, loader):
"""验证"""
self.model.eval()
running_loss = 0.0
correct = 0
total = 0
with torch.no_grad():
for inputs, labels in loader:
inputs, labels = inputs.to(self.device), labels.to(self.device)
outputs = self.model(inputs)
loss = self.criterion(outputs, labels)
running_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
return running_loss / len(loader), correct / total
def predict(self, image_path):
"""单张图像预测"""
from PIL import Image
transform = test_transform
image = Image.open(image_path).convert('RGB')
image_tensor = transform(image).unsqueeze(0).to(self.device)
self.model.eval()
with torch.no_grad():
outputs = self.model(image_tensor)
probs = F.softmax(outputs, dim=1)
_, predicted = torch.max(outputs, 1)
return predicted.item(), probs[0].cpu().numpy()
# 使用示例
pipeline = ImageClassificationPipeline(num_classes=10)
history = pipeline.train(train_loader, val_loader, epochs=20)
📚 前沿研究方向
生成模型
| 模型类型 |
代表模型 |
应用 |
链接 |
| GAN |
StyleGAN, CycleGAN |
图像生成、风格迁移 |
Paper |
| VAE |
VQ-VAE |
图像压缩、生成 |
Paper |
| Diffusion |
Stable Diffusion, DALL-E 2 |
文生图 |
Paper |
| Flow |
Glow, RealNVP |
密度估计 |
Paper |
大模型
| 模型 |
参数量 |
特点 |
| GPT-4 |
未知 |
最强通用模型 |
| LLaMA |
7B-70B |
开源 SOTA |
| CLIP |
400M |
图文对比学习 |
| SAM |
1B+ |
图像分割大模型 |
最后更新: 2026-06-01
相关文档:
- machine-learning-resources.md - 机器学习资源
- nlp-resources.md - 自然语言处理资源
- visualization-resources.md - 数据可视化资源
**深度学习资源专题 | 从 CNN 到 Transformer**
[返回顶部](#深度学习资源专题)