IT评测·应用市场-qidao123.com技术社区

标题: 从零开始:AIGC中的变分自编码器(VAE)代码与实现 [打印本页]

作者: 王柳    时间: 2024-12-30 16:02
标题: 从零开始:AIGC中的变分自编码器(VAE)代码与实现
个人主页:chian-ocean

文章专栏

深入理解AIGC中的变分自编码器(VAE)及其应用


随着AIGC(AI-Generated Content)技能的发展,生成式模型在内容生成中的职位愈发紧张。从文本生成到图像生成,变分自编码器(Variational Autoencoder, VAE)作为生成式模型的一种,已经广泛应用于多个范畴。本文将具体先容VAE的理论基础、数学原理、代码实现、实际应用以及与其他生成模型的对比。

1. 什么是变分自编码器(VAE)?

变分自编码器(VAE)是一种生成式深度学习模型,结合了传统的概率图模型与深度神经网络,能够在输入空间和隐变量空间之间建立接洽。VAE与平凡自编码器差异,其目标不光仅是重建输入,而是学习数据的概率分布,从而生成新的、高质量的样本。
1.1 VAE 的焦点特点



2. VAE 的数学基础

VAE的基本思想是将输入数据 ( x ) 编码到一个匿伏空间(隐空间)中体现为 ( z ),然后通过解码器从 ( z ) 生成重建数据 ( x’ )。为了实现这一点,VAE引入了以下几个数学概念:
2.1 概率模型

我们假设数据 ( x ) 是由隐变量 ( z ) 生成的,整个过程可以体现为:
[
p(x, z) = p(z) p(x|z)
]
此中:

2.2 最大化似然

我们希望最大化数据的对数似然 ( \log p(x) ):
[
\log p(x) = \int p(x, z) dz = \int p(z) p(x|z) dz
]
但由于直接盘算该积分是困难的,VAE引入了变分推断,通过优化变分下界(ELBO)来近似求解。
2.3 变分下界(Evidence Lower Bound, ELBO)

ELBO定义如下:
[
\log p(x) \geq \mathbb{E}_{q(z|x)} \left[ \log p(x|z) \right] - \text{KL}(q(z|x) || p(z))
]
此中:

目标是最大化ELBO,可以看作是两部分:

3. VAE 的实现

以下是使用 PyTorch 实现 VAE 的完整代码示例。
3.1 导入必要的库

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. from torch.utils.data import DataLoader
  5. from torchvision import datasets, transforms
  6. from torchvision.utils import save_image
  7. import os
复制代码
3.2 定义 VAE 的布局

编码器与解码器的实现:

  1. # 定义 VAE 模型
  2. class VAE(nn.Module):
  3.     def __init__(self, input_dim=784, hidden_dim=400, latent_dim=20):
  4.         super(VAE, self).__init__()
  5.         # 编码器
  6.         self.fc1 = nn.Linear(input_dim, hidden_dim)
  7.         self.fc_mu = nn.Linear(hidden_dim, latent_dim)
  8.         self.fc_logvar = nn.Linear(hidden_dim, latent_dim)
  9.         # 解码器
  10.         self.fc2 = nn.Linear(latent_dim, hidden_dim)
  11.         self.fc3 = nn.Linear(hidden_dim, input_dim)
  12.         self.sigmoid = nn.Sigmoid()
  13.     def encode(self, x):
  14.         h1 = torch.relu(self.fc1(x))
  15.         mu = self.fc_mu(h1)
  16.         logvar = self.fc_logvar(h1)
  17.         return mu, logvar
  18.     def reparameterize(self, mu, logvar):
  19.         std = torch.exp(0.5 * logvar)
  20.         eps = torch.randn_like(std)
  21.         return mu + eps * std
  22.     def decode(self, z):
  23.         h2 = torch.relu(self.fc2(z))
  24.         return self.sigmoid(self.fc3(h2))
  25.     def forward(self, x):
  26.         mu, logvar = self.encode(x)
  27.         z = self.reparameterize(mu, logvar)
  28.         return self.decode(z), mu, logvar
复制代码
3.3 定义损失函数

  1. # 损失函数包含重建误差和KL散度
  2. def loss_function(recon_x, x, mu, logvar):
  3.     BCE = nn.functional.binary_cross_entropy(recon_x, x, reduction='sum')
  4.     KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
  5.     return BCE + KLD
复制代码
3.4 加载数据集

  1. # 加载 MNIST 数据集
  2. transform = transforms.Compose([
  3.     transforms.ToTensor(),
  4.     transforms.Normalize((0.5,), (0.5,))
  5. ])
  6. dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
  7. dataloader = DataLoader(dataset, batch_size=128, shuffle=True)
复制代码
3.5 训练模型

  1. # 训练 VAE 模型
  2. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  3. vae = VAE().to(device)
  4. optimizer = optim.Adam(vae.parameters(), lr=1e-3)
  5. epochs = 10
  6. for epoch in range(epochs):
  7.     vae.train()
  8.     train_loss = 0
  9.     for batch_idx, (data, _) in enumerate(dataloader):
  10.         data = data.view(-1, 784).to(device)
  11.         optimizer.zero_grad()
  12.         recon_batch, mu, logvar = vae(data)
  13.         loss = loss_function(recon_batch, data, mu, logvar)
  14.         loss.backward()
  15.         train_loss += loss.item()
  16.         optimizer.step()
  17.     print(f'Epoch [{epoch+1}/{epochs}], Loss: {train_loss/len(dataloader.dataset):.4f}')
  18.     # 保存生成的样本
  19.     with torch.no_grad():
  20.         z = torch.randn(64, 20).to(device)
  21.         sample = vae.decode(z).cpu()
  22.         save_image(sample.view(64, 1, 28, 28), f'./results/sample_{epoch+1}.png')
复制代码

4. VAE 的应用

4.1 图像生成


示例:生成图像

  1. # 从隐空间采样并生成图像
  2. vae.eval()
  3. with torch.no_grad():
  4.     z = torch.randn(16, 20).to(device)  # 生成随机潜在向量
  5.     sample = vae.decode(z).cpu()
  6.     save_image(sample.view(16, 1, 28, 28), 'generated_images.png')
复制代码
4.2 数据压缩


4.3 数据补全


4.4 多模态生成



5. VAE 与其他生成模型的对比

特性VAEGAN扩散模型目标函数基于概率分布的最大似然估计对抗性目标(生成器与判别器)基于去噪和扩散过程生成样本的质量样本质量相对较低高质量样本高质量且多样性较好训练稳固性稳固训练可能不稳固稳固,但盘算量大应用场景压缩、生成、多模态生成图像生成、艺术设计高精度图像生成
6. 总结

变分自编码器(VAE)作为一种生成式模型,依附其概率建模能力和隐空间布局化体现,在图像生成、数据降维、数据补全等范畴展现了强盛的能力。只管VAE生成的样本质量可能不如GAN,但其稳固性息争释性使其成为许多应用场景的首选模型。
通过这篇文章和代码实现,希望各人能够深入理解VAE的原理、实现过程以及其在AIGC中的实际应用。假如您对VAE感兴趣,不妨尝试在本身的数据集上举行训练与测试!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4