keras 变分自动编码器角速率中均值和log_variance的实现

gkn4icbw  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(186)

作为VAE https://keras.io/examples/generative/vae/在Keras中的实现,我们必须传递平均值和log_variance来计算潜在空间中的分布。

class Sampling(layers.Layer):
"""Uses (z_mean, z_log_var) to sample z, the vector encoding a digit."""

def call(self, inputs):
    z_mean, z_log_var = inputs
    batch = tf.shape(z_mean)[0]
    dim = tf.shape(z_mean)[1]
    epsilon = tf.keras.backend.random_normal(shape=(batch, dim))
    return z_mean + tf.exp(0.5 * z_log_var) * epsilon

# flatten layer
x = layers.Flatten()(x)
x = layers.Dense(16, activation="relu")(x)
z_mean = layers.Dense(latent_dim, name="z_mean")(x)
z_log_var = layers.Dense(latent_dim, name="z_log_var")(x)
z = Sampling()([z_mean, z_log_var])
encoder = keras.Model(encoder_inputs, [z_mean, z_log_var, z], name="encoder")
encoder.summary()

我不明白为什么两个密集层可以代表平均值和对数方差,而不做任何特殊的计算?因为从上面的代码只是简单地创建一个密集层,并从以前的平面层接收结果。

nvbavucw

nvbavucw1#

使用Kullback-Leibler散度损失函数训练密集输出层以输出输入的均值和对数方差。
在Keras示例VAE模型中,使用密集层的输出在自定义train_step中计算:

kl_loss = -0.5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var))

相关问题