#MAE (Masked Autoencoders):视觉领域的预训练黑科技
📂 所属阶段:第四阶段 — 视觉新范式(Transformer 篇)
🔗 相关章节:Swin Transformer · Vision-Language 多模态
#1. MAE 核心思想
MAE = Masked Autoencoders for Self-Supervised Learning
灵感:NLP 中的 BERT(Masked Language Model)
步骤:
1. 随机遮盖 75% 的 Patches
2. 编码器处理可见 Patches
3. 解码器重建被遮盖的 Patches
4. 通过重建损失训练
优势:
- 无需标注数据
- 学到更好的特征表示
- 下游任务微调效果更好#2. MAE 实现原理
"""
MAE 训练流程:
1. 输入:224×224 图像
2. 分成 196 个 16×16 Patches
3. 随机选择 75%(147 个)遮盖
4. 编码器:处理 49 个可见 Patches
5. 解码器:重建 196 个 Patches
6. 损失:只计算被遮盖 Patches 的重建误差
"""
import torch
import torch.nn as nn
class MAE(nn.Module):
def __init__(self, image_size=224, patch_size=16, mask_ratio=0.75):
super().__init__()
self.image_size = image_size
self.patch_size = patch_size
self.mask_ratio = mask_ratio
num_patches = (image_size // patch_size) ** 2
self.num_patches = num_patches
self.num_masked = int(num_patches * mask_ratio)
# 编码器和解码器
self.encoder = nn.TransformerEncoder(
nn.TransformerEncoderLayer(d_model=768, nhead=12),
num_layers=12
)
self.decoder = nn.TransformerDecoder(
nn.TransformerDecoderLayer(d_model=768, nhead=12),
num_layers=8
)
def forward(self, x):
# 随机遮盖
mask = torch.rand(x.shape[0], self.num_patches) < self.mask_ratio
# 编码可见 Patches
visible_patches = x[~mask]
encoded = self.encoder(visible_patches)
# 解码重建
reconstructed = self.decoder(encoded, x)
# 计算重建损失(只在被遮盖位置)
loss = ((reconstructed[mask] - x[mask]) ** 2).mean()
return loss#3. 使用预训练 MAE
import torch
from timm.models import mae_vit_base_patch16
# 加载预训练 MAE
model = mae_vit_base_patch16(pretrained=True)
# 微调下游任务
# 移除解码器,只保留编码器
encoder = model.encoder
# 添加分类头
classifier = nn.Linear(768, 1000)
# 微调
x = torch.randn(1, 3, 224, 224)
features = encoder(x)
output = classifier(features)#4. 小结
MAE 的意义:
1. 自监督学习:无需标注数据
2. 更好的预训练:下游任务性能 +3-5%
3. 可扩展性:可以预训练更大的模型
2026 年趋势:
- 自监督学习成为主流
- 无标注数据也能训练好模型
- 预训练 + 微调 = 标准流程💡 记住:MAE 证明了自监督学习在 CV 中的有效性。这是未来深度学习的方向。
🔗 扩展阅读

