共计 2983 个字符,预计需要花费 8 分钟才能阅读完成。
原理简述
自动编码器 (Autoencoder, AE) 是一种无监督学习的神经网络结构,核心思想是通过编码 - 解码过程学习数据的压缩表示。它由两部分组成:

- 编码器(Encoder): 将输入数据压缩为低维度的隐空间表示(latent code)
- 解码器(Decoder): 从隐空间重建原始输入数据
与传统特征工程方法相比,AE 的优势在于:
- 自动学习数据特征,无需人工设计特征提取规则
- 适用于无标签数据,扩大了应用场景
- 通过控制隐层维度实现灵活的特征压缩
环境准备
推荐使用 Python 3.8+ 和以下库版本:
# requirements.txt
torch==1.12.1
torchvision==0.13.1
pytorch-lightning==1.7.7
matplotlib==3.5.3
安装命令:
pip install -r requirements.txt
模型架构
使用 PyTorch Lightning 构建标准 AE 模型:
import torch
import torch.nn as nn
import torch.nn.functional as F
import pytorch_lightning as pl
class Autoencoder(pl.LightningModule):
def __init__(self, input_dim=784, hidden_dim=64, lr=1e-3):
super().__init__()
# 编码器
self.encoder = nn.Sequential(nn.Linear(input_dim, 256),
nn.ReLU(),
nn.Linear(256, hidden_dim)
)
# 解码器
self.decoder = nn.Sequential(nn.Linear(hidden_dim, 256),
nn.ReLU(),
nn.Linear(256, input_dim),
nn.Sigmoid())
self.lr = lr
def forward(self, x):
z = self.encoder(x)
return self.decoder(z)
def training_step(self, batch, batch_idx):
x, _ = batch
x = x.view(x.size(0), -1) # 展平
x_recon = self(x)
loss = F.mse_loss(x_recon, x)
self.log("train_loss", loss)
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=self.lr)
训练优化
关键参数配置
使用 argparse 管理超参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--batch_size", type=int, default=128)
parser.add_argument("--hidden_dim", type=int, default=64)
parser.add_argument("--max_epochs", type=int, default=50)
parser.add_argument("--lr", type=float, default=1e-3)
args = parser.parse_args()
训练循环
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
transform = transforms.ToTensor()
train_data = datasets.MNIST("./data", train=True, download=True, transform=transform)
train_loader = DataLoader(train_data, batch_size=args.batch_size, shuffle=True)
model = Autoencoder(hidden_dim=args.hidden_dim, lr=args.lr)
trainer = pl.Trainer(max_epochs=args.max_epochs, gpus=1)
trainer.fit(model, train_loader)
避坑指南
- 维度坍缩问题:当隐层维度设置过小时,模型会丢失过多信息。解决方案是逐步增加隐层维度并观察重建质量
- 学习率设置:建议初始尝试 1e-3,如果损失波动大则降低到 1e-4
- GPU 加速 :使用
trainer = pl.Trainer(gpus=1)启用 GPU
效果评估
可视化重建结果
import matplotlib.pyplot as plt
def plot_reconstruction(model, test_loader):
data, _ = next(iter(test_loader))
data = data.view(data.size(0), -1)
with torch.no_grad():
recon = model(data)
fig, axes = plt.subplots(2, 5, figsize=(10, 4))
for i in range(5):
axes[0,i].imshow(data[i].view(28, 28), cmap="gray")
axes[1,i].imshow(recon[i].view(28, 28), cmap="gray")
plt.show()
隐空间可视化
from sklearn.manifold import TSNE
def visualize_latent(model, test_loader):
latents, labels = [], []
for data, label in test_loader:
data = data.view(data.size(0), -1)
with torch.no_grad():
z = model.encoder(data)
latents.append(z)
labels.append(label)
latent_all = torch.cat(latents).numpy()
tsne = TSNE(n_components=2)
latent_2d = tsne.fit_transform(latent_all)
plt.scatter(latent_2d[:,0], latent_2d[:,1], c=labels, alpha=0.5)
plt.colorbar()
plt.show()
生产建议
-
模型保存与加载
# 保存 torch.save(model.state_dict(), "ae_model.pth") # 加载 model = Autoencoder() model.load_state_dict(torch.load("ae_model.pth")) -
批量大小选择:对于 MNIST 等小图像,128-256 是合理范围;对于更大图像可适当减小
-
进阶方向:
- 尝试卷积结构的 AE 处理图像数据
- 探索变分自编码器 (VAE) 生成新样本
- 使用去噪自编码器 (DAE) 提升鲁棒性
通过这个实战教程,你应该已经掌握了 AE 的核心原理和 PyTorch 实现方法。建议动手修改超参数观察效果变化,这是理解模型行为的最佳方式。
正文完
