作为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()
我不明白为什么两个密集层可以代表平均值和对数方差,而不做任何特殊的计算?因为从上面的代码只是简单地创建一个密集层,并从以前的平面层接收结果。
1条答案
按热度按时间nvbavucw1#
使用Kullback-Leibler散度损失函数训练密集输出层以输出输入的均值和对数方差。
在Keras示例VAE模型中,使用密集层的输出在自定义train_step中计算: