目录
“自编码器”中的“自”指的是它使用未标记的输入数据来训练自身
变分自编码器(Variational Autoencoder, VAE)
why VAE:
关于变分自编码器,这篇文章讲的不错
机器学习方法—优雅的模型(一):变分自编码器(VAE) - 知乎
vae入门源码教程 推荐:
AIGC笔记--VAE模型的搭建_vae模型搭建-CSDN博客
完整源码:
https://github.com/liujf69/Classic-Generative-Model/tree/main/VAE
入门实例代码:
训练的时候回归的是均值和方差,预测的时候,也是回归均值和方差,然后根据均值和方差生成高斯噪声。
import torch
from torch import nn
from torch.nn import functional as F
class VAE(nn.Module):
def __init__(self, input_dim = 784, h_dim = 400, z_dim = 20):
super(VAE, self).__init__()
self.fc1 = nn.Linear(input_dim, h_dim) # 28*28 → 784
self.fc21 = nn.Linear(h_dim, z_dim) # 均值
self.fc22 = nn.Linear(h_dim, z_dim) # 标准差
self.fc3 = nn.Linear(z_dim, h_dim)
self.fc4 = nn.Linear(h_dim, input_dim) # 784 → 28*28
self.input_dim = input_dim
def encode(self, x):
h1 = F.relu(self.fc1(x))
return self.fc21(h1), self.fc22(h1) # 均值、标准差
def reparameterize(self, mu, logvar):
std = torch.exp(0.5*logvar)
eps = torch.randn_like(std)
# z = mu + eps*std
return mu + eps*std
def decode(self, z):
h3 = F.relu(self.fc3(z))
# sigmoid: 0-1 之间,后边会用到 BCE loss 计算重构 loss(reconstruction loss)
return torch.sigmoid(self.fc4(h3))
def forward(self, x):
mu, logvar = self.encode(x.view(-1, self.input_dim))
z = self.reparameterize(mu, logvar)
return self.decode(z), mu, logvar
def main():
# 设备配置,使用CUDA如果可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 加载训练好的模型
model = VAE().to(device)
# model.load_state_dict(torch.load("vae.pth")) # 假设模型文件名为vae.pth
model.eval() # 设置为评估模式
data = torch.rand(1, 784).cuda()
# 使用模型进行推理
with torch.no_grad():
reconstructed, _, _ = model(data)
print("Images saved: original_sample.png, reconstructed_sample.png",reconstructed.size())
if __name__ == "__main__":
main()
变分自编码器(Variational Autoencoder,简称VAE)是一种生成模型,它通过结合深度学习与概率图模型的理念,能够学习输入数据的潜在表示。VAE不仅能够进行数据的压缩编码,还能够生成与训练数据相似的新数据。以下是一些关键点,帮助更好地理解变分自编码器:
1. 自编码器(Autoencoder)的基础
“自编码器”中的“自”指的是它使用未标记的输入数据来训练自身
,而不是依赖于外部的标签或指导。简单来说,自编码器学习的是如何将输入数据压缩成一个更小的编码(低维表示),然后再从该编码重构出原始输入数据。
变分自编码器是自编码器的一种扩展。传统的自编码器包括两部分:编码器和解码器。编码器负责将高维输入数据压缩到一个低维潜在空间(latent space),而解码器则负责将这个低维表示恢复成原始数据。自编码器主要用于数据降维和特征学习。
2. 引入概率图模型
变分自编码器与传统自编码器的主要区别在于它引入了概率图模型的概念。在VAE中,编码器不直接输出一个潜在空间的点,而是输出该点的参数,通常是均值和方差。这些参数描述了一个概率分布,通常假设为高斯分布。这意味着每个输入数据点都被映射到一个概率分布上,而不是被映射到一个固定的点上。
3. 重参数化技巧
由于潜在变量是随机的,直接从概率分布中采样会导致无法通过反向传播进行有效的梯度计算。VAE使用一种称为“重参数化技巧”的方法来解决这个问题。具体来说,如果潜在变量 z 服从均值为 μ、方差为 2σ2 的正态分布,那么可以从标准正态分布采样 ϵ,然后计算z=μ+σϵ。这样,随机性仅存在于 ϵ 中,而 μ 和 σ 都是确定的函数,可以通过反向传播来更新。
4. 损失函数
VAE的损失函数包含两部分:一部分是重构误差,即原始数据和通过VAE生成的数据之间的差异;另一部分是KL散度(Kullback-Leibler divergence),它衡量编码后的潜在分布与先验分布(通常是标准正态分布)之间的差异。这种设计既鼓励模型准确重构数据,又使潜在空间的分布有良好的数学性质(例如,使潜在空间连续且无空隙)。
5. 应用
变分自编码器广泛应用于图像生成、半监督学习、异常检测等领域。它们在生成类似于训练数据的新数据方面特别有用。
总的来说,变分自编码器是一种强大的生成模型,它结合了深度学习的表征能力和概率模型的数学框架,使其能够有效地学习复杂数据的生成规律。