• VAE学习总结


    教程

    https://avandekleut.github.io/vae/

    这个教程超好
    这里需要强调的是,VAE的实现部分,除了Encoder部分和普通的autoencoder不一样,其Decoder部分和普通的autoencoder的部分是一样的写法,例如

    https://github.com/Jackson-Kang/Pytorch-VAE-tutorial/blob/master/01_Variational_AutoEncoder.ipynb

    """
        A simple implementation of Gaussian MLP Encoder and Decoder
    """
    
    class Encoder(nn.Module):
        
        def __init__(self, input_dim, hidden_dim, latent_dim):
            super(Encoder, self).__init__()
    
            self.FC_input = nn.Linear(input_dim, hidden_dim)
            self.FC_input2 = nn.Linear(hidden_dim, hidden_dim)
            self.FC_mean  = nn.Linear(hidden_dim, latent_dim)
            self.FC_var   = nn.Linear (hidden_dim, latent_dim)
            
            self.LeakyReLU = nn.LeakyReLU(0.2)
            
            self.training = True
            
        def forward(self, x):
            h_       = self.LeakyReLU(self.FC_input(x))
            h_       = self.LeakyReLU(self.FC_input2(h_))
            mean     = self.FC_mean(h_)
            log_var  = self.FC_var(h_)                     # encoder produces mean and log of variance 
                                                           #             (i.e., parateters of simple tractable normal distribution "q"
            
            return mean, log_var
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    class Decoder(nn.Module):
        def __init__(self, latent_dim, hidden_dim, output_dim):
            super(Decoder, self).__init__()
            self.FC_hidden = nn.Linear(latent_dim, hidden_dim)
            self.FC_hidden2 = nn.Linear(hidden_dim, hidden_dim)
            self.FC_output = nn.Linear(hidden_dim, output_dim)
            
            self.LeakyReLU = nn.LeakyReLU(0.2)
            
        def forward(self, x):
            h     = self.LeakyReLU(self.FC_hidden(x))
            h     = self.LeakyReLU(self.FC_hidden2(h))
            
            x_hat = torch.sigmoid(self.FC_output(h))
            return x_hat
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    class Model(nn.Module):
        def __init__(self, Encoder, Decoder):
            super(Model, self).__init__()
            self.Encoder = Encoder
            self.Decoder = Decoder
            
        def reparameterization(self, mean, var):
            epsilon = torch.randn_like(var).to(DEVICE)        # sampling epsilon        
            z = mean + var*epsilon                          # reparameterization trick
            return z
            
                    
        def forward(self, x):
            mean, log_var = self.Encoder(x)
            z = self.reparameterization(mean, torch.exp(0.5 * log_var)) # takes exponential function (log var -> var)
            x_hat            = self.Decoder(z)
            
            return x_hat, mean, log_var
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    encoder = Encoder(input_dim=x_dim, hidden_dim=hidden_dim, latent_dim=latent_dim)
    decoder = Decoder(latent_dim=latent_dim, hidden_dim = hidden_dim, output_dim = x_dim)
    
    model = Model(Encoder=encoder, Decoder=decoder).to(DEVICE)
    
    • 1
    • 2
    • 3
    • 4

    decoder就是一个全连接层,没有别的多余的东西

  • 相关阅读:
    Linux命令全解
    江同志是怎样逆划水的?
    Javaweb笔试题及机试题(附答案)
    【毕业设计】中文汉字识别算法 - 深度学习 卷积神经网络 机器视觉 OCR
    Spring MVC框架
    Flutter ‘/usr/lib/libswiftCore.dylib‘ (no such file)
    记参加Microsoft Ignite 大会和北京CSDN创作者之夜
    基于Android系统PJSIP库植入g729编码
    Jmeter使用常见问题
    Andoird使用Room实现持久化及使用Room进行增删查改
  • 原文地址:https://blog.csdn.net/qq_45759229/article/details/134324112