VAE 变分自编码器实现
VAE(变分自编码器)通过变分推断学习数据的潜在表示,是生成模型的重要基础。
VAE 实现
python
class VAE(nn.Module):
def __init__(self, input_dim=784, hidden_dim=400, latent_dim=20):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(input_dim, hidden_dim), nn.ReLU(),
)
self.fc_mu = nn.Linear(hidden_dim, latent_dim)
self.fc_var = nn.Linear(hidden_dim, latent_dim)
self.decoder = nn.Sequential(
nn.Linear(latent_dim, hidden_dim), nn.ReLU(),
nn.Linear(hidden_dim, input_dim), nn.Sigmoid()
)
def reparameterize(self, mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * std
def forward(self, x):
h = self.encoder(x)
mu, log_var = self.fc_mu(h), self.fc_var(h)
z = self.reparameterize(mu, log_var)
return self.decoder(z), mu, log_var
def vae_loss(recon_x, x, mu, log_var):
BCE = F.binary_cross_entropy(recon_x, x, reduction='sum')
KLD = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())
return BCE + KLD重参数化技巧
重参数化(Reparameterization)使得采样操作可微分,从而允许梯度通过随机节点反向传播。这是 VAE 训练的关键。