主流深度学习模型架构概览
CNN、RNN、Transformer、MLP——各架构的适用场景与 PyTorch 代码示例。
模型架构入门
🗺️ 主流架构总览
┌────────────────────────────────────────────────────────┐
│ 模型架构 │
├────────────┬─────────────┬──────────────┬──────────────┤
│ CNN │ RNN │ Transformer │ MLP │
│ (图像领域) │ (序列数据) │ (NLP/多模态) │ (表格数据) │
└────────────┴─────────────┴──────────────┴──────────────┘
1️⃣ 全连接网络 (MLP) —— 最基础的砖块
import torch.nn as nn
class SimpleMLP(nn.Module):
def __init__(self, input_size=784, hidden_size=256, num_classes=10):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(hidden_size, num_classes),
)
def forward(self, x):
x = x.view(x.size(0), -1) # 展平
return self.net(x)适用场景:表格数据、小型分类任务
缺点:不能很好地处理图像空间信息和序列时间信息
2️⃣ CNN (卷积神经网络) —— 图像领域的基石
核心组件
| 层 | 作用 | 类比 |
|---|---|---|
| 卷积层 | 提取局部特征 | 用滤镜扫描图片 |
| 池化层 | 降采样,保留主要特征 | 缩小图片尺寸 |
| 全连接层 | 最终分类 | 综合判断 |
LeNet-5 结构示例 (经典)
输入 (32x32)
→ Conv1 (6@28x28) → ReLU → Pool (6@14x14)
→ Conv2 (16@10x10) → ReLU → Pool (16@5x5)
→ Flatten → FC(120) → FC(84) → FC(10) → Softmax
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.conv_layers = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(16, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1, 1)),
)
self.classifier = nn.Linear(64, num_classes)
def forward(self, x):
x = self.conv_layers(x)
x = x.view(x.size(0), -1)
return self.classifier(x)现代 CNN 进化:AlexNet → VGG → ResNet → EfficientNet
3️⃣ RNN & LSTM —— 序列数据处理
遇到的问题:长期依赖
- 普通 RNN:记不住太久以前的信息(梯度消失)
- LSTM:通过”门控机制”解决长期记忆问题
class SimpleLSTM(nn.Module):
def __init__(self, vocab_size=10000, embed_dim=256,
hidden_size=128, num_layers=2, num_classes=2):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(
input_size=embed_dim,
hidden_size=hidden_size,
num_layers=num_layers,
batch_first=True,
bidirectional=True,
dropout=0.2,
)
self.classifier = nn.Linear(hidden_size * 2, num_classes)
def forward(self, x):
x = self.embedding(x)
output, (h_n, c_n) = self.lstm(x)
# 取最后一个时间步的输出
last_hidden = output[:, -1, :]
return self.classifier(last_hidden)4️⃣ Transformer —— 当前最热架构
核心创新
- 自注意力 (Self-Attention):每个词看所有词,找关联
- 多头注意力 (Multi-Head Attention):从不同角度理解
- 位置编码:告诉模型词的顺序
Transformer = Encoder (理解) + Decoder (生成)
BERT = Encoder only → 理解任务 (分类、NER)
GPT = Decoder only → 生成任务 (写作、对话)
T5 = Encoder+Decoder → 翻译、摘要
# 使用 HuggingFace 加载预训练 Transformer
from transformers import AutoModel, AutoTokenizer
model_name = "bert-base-chinese" # 中文 BERT
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
text = "今天天气真好"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)5️⃣ 怎么选择架构?
| 任务类型 | 推荐架构 | 说明 |
|---|---|---|
| 图像分类 | ResNet / EfficientNet | CNN 依然能打 |
| 图像检测 | YOLO / DETR | 实时检测 |
| 文本分类 | BERT / RoBERTa | Transformer |
| 文本生成 | GPT / LLaMA | Decoder-only |
| 语音识别 | Whisper / Wav2Vec2 | 专用架构 |
| 推荐系统 | DCN / DeepFM | MLP + 特征交叉 |
| 表格数据 | XGBoost / TabNet | 树模型常比 DL 好 |
📌 一句话总结
CNN 看局部 → RNN 看顺序 → Transformer 看全局
🔗 下一篇
→ 训练流程全解析