VAE的原理和代码实现

VAE的原理和代码实现


重要参考:
https://spaces.ac.cn/archives/5253
https://www.jianshu.com/p/ff28eef92fa1
完整代码:
https://github.com/taichuai/d2l_zh_tensorflow2.0/blob/master/VAE%E5%AE%9E%E6%88%98.ipynb


VAE(Variational Autoencoder)中文译为变分自动编码器,它是一种深度生成模型(Deep Generative Model),是一种无监督学习算法。那么VAE的设计思路来源是什么?VAE能干嘛?代码如何实现?以及还可以怎样改进呢?下面一一道来。

1、VAE的设计来源
VAE的原理和代码实现_第1张图片
2、VAE的主要思路
VAE的原理和代码实现_第2张图片
VAE的原理和代码实现_第3张图片
VAE的原理和代码实现_第4张图片
VAE的原理和代码实现_第5张图片

3、VAE究竟能干嘛

可以用来生成接近训练数据的不同数据,包括图像生成,音频合成等。

4、VAE的tf2代码实现

简单来讲,重点在于类似两个encoder编码(都写在encoder中),生成均值方差,然后使用重参数采样reparameterize计算得到隐向量

z_dim = 10


from tensorflow.keras import Sequential

class VAE(keras.Model):
    def __init__(self):
        super(VAE, self).__init__()
        # encoder
        self.e1 = keras.layers.Dense(128)
        print(self.e1)
        self.e2 = keras.layers.Dense(z_dim)   # get mean prediction
        self.e3 = keras.layers.Dense(z_dim)   #  get mean prediction
        
        # decoder
        self.fc4 = keras.layers.Dense(128)
        self.fc5 = keras.layers.Dense(784)
    
    def encoder(self, inputs):
        h = self.e1(inputs)
        h = tf.nn.relu(h)
        # get_mean
        mean = self.e2(h)
        # get_variance
        log_var = self.e3(h)    # 一般方差做一个log,方便计算
        
        return mean, log_var
    
    def decoder(self, z):
        out = tf.nn.relu(self.fc4(z))
        out = self.fc5(out)
        
        return out
    
    def reparameterize(self, mean, log_var):
        eps = tf.random.normal(tf.shape(log_var))
        
        std = tf.exp(log_var)**0.5    # 开根号
        
        z = mean + std * eps
        
        return z
        
    
    def call(self, inputs, training=None):
        # [b, 784] -> [b, z_dim], [b, z_dim]
        mean, log_var = self.encoder(inputs)
        # trick: reparameterization trick,采样
        z = self.reparameterize(mean, log_var)
        x_hat = self.decoder(z)
        
        # 返回 x 的同时,返回 mean和val作为约束
        return x_hat, mean, log_var

5、VAE改进??

VAE的原理和代码实现_第6张图片
关于cvae的实现代码可参考苏神,其实就是修改 KL_loss损失,:

# 只需要修改K.square(z_mean)为K.square(z_mean - yh),也就是让隐变量向类内均值看齐
kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean - yh) - K.exp(z_log_var), axis=-1)

具体的
https://github.com/bojone/vae/blob/master/cvae_keras.py

你可能感兴趣的:(tf2.0,自然语言处理,深度学习)