import torch import torch.nn as nn class ConditionalVAE(nn.Module): def __init__(self, x_dim, c_dim, latent_dim): super(ConditionalVAE, self).__init__() self.encoder_fc = nn.Sequential( nn.Linear(x_dim + c_dim, 256), nn.ReLU(), nn.Linear(256, 128), nn.ReLU() ) self.fc_mu = nn.Linear(128, latent_dim) self.fc_logvar = nn.Linear(128, latent_dim) self.decoder_fc = nn.Sequential( nn.Linear(latent_dim + c_dim, 128), nn.ReLU(), nn.Linear(128, 256), nn.ReLU(), nn.Linear(256, x_dim) ) def encode(self, x, c): inputs = torch.cat([x, c], dim=1) h = self.encoder_fc(inputs) return self.fc_mu(h), self.fc_logvar(h) def reparameterize(self, mu, logvar): std = torch.exp(0.5 * logvar) eps = torch.randn_like(std) return mu + eps * std def decode(self, z, c): inputs = torch.cat([z, c], dim=1) return self.decoder_fc(inputs) def forward(self, x, c): mu, logvar = self.encode(x, c) z = self.reparameterize(mu, logvar) x_recon = self.decode(z, c) return x_recon, mu, logvar