自编码器
自编码器提出年代较早,因此最初只是三层的全连接网络,后面加深网络、引入卷积层、增加了各种正则(去噪、稀疏、收缩)等等改进。
参考链接:
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.
稳定扩散模型是在自编码器的隐空间中训练扩散模型