自编码器
自编码器提出年代较早,因此最初只是三层的全连接网络,后面加深网络、引入卷积层、增加了各种正则(去噪、稀疏、收缩)等等改进。
参考链接:
PyTorch 学习笔记:自动编码器
Illustrating latent space
https://github.com/nathanhubens/Autoencoders
https://github.com/L1aoXingyu/pytorch-beginner/tree/master/08-AutoEncoder
Simple_Autoencoder_Solution
Variational Autoencoders Explained
https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html
准备工作:下载数据、定义绘图函数
1  | import matplotlib.pyplot as plt  | 
AutoEncoder
自编码器:全连接网络、均方误差损失
1  | import torch.nn as nn  | 
这是一个简单的自编码器,本质上是三层的全连接网络,特殊之处在于输入与输出维度及取值范围一致,且中间隐含层维度通常比输入层低。模型被刻意拆解为编码器及解码器两部分,乍看之下显得比全连接复杂,其实并无区别。模型经训练后,使用时通常只需其中之一:数据降维用编码器,数据生成用解码器。
具体的,上述模型中,输入层及输出层维度均为28*28(MNIST图片),输入数据经to_tensor转换后位于(0, 1),因此输出层激活函数选择Sigmoid,使输出与输入范围一致,便于对比。此外,为了便于之后可视化隐变量空间,这里隐含层维度设置为2。在这些限制之下,网络结构本身可调整的并不多,可修改的只有损失函数以及隐含层的激活函数。
上述模型中,损失函数取均方误差MSE,隐含层激活函数则设为Tanh。模型性能优化只能靠模型训练超参数的调整,如批尺寸、初始化(?)、优化器、学习率、(重复训练)回合数等。最后,还可将输入数据转换至(-1,1),与输入保持一致,此时输出层激活需改为Tanh。
- 编码器用Tanh激活,意味解码器输入位于(-1, 1),用ReLU则解码器输入始终大于0
 
训练准备:计算平台、数据分批
1  | import torch  | 
模型训练
1  | model = AutoEncoder().to(device)  | 
模型性能直接由隐变量维度决定,这里设置为2,便于可视化隐变量空间
数据压缩
1  | test_data = MNIST(root='CVdata', train=False, download=True, transform=to_tensor)  | 
数据生成
1  | num = 21  | 
隐空间可视化
1  | plt.figure(figsize=(15, 6))  | 
ReLU
1  | # Vanilla AutoEncoder  | 
Data Normalize
1  | from torchvision.transforms import Compose, ToTensor, Normalize  | 
Deep/Conv AE
加深网络层数
1  | import torch.nn as nn  | 
1  | class DeepAE(nn.Module):  | 
1  | training(model, loss_func, optimizer)  | 
使用卷积网络
1  | class ConvAE(nn.Module):  | 
Regularization
加入正则化
Variational AE
1  | class VAE(nn.Module):  | 
1  | # VAE model  | 
Stable Diffusion is a latent diffusion model which combines an autoencoder with a diffusion model that is trained in the latent space of the autoencoder.
稳定扩散模型是在自编码器的隐空间中训练扩散模型