import tensorflow as tf from tensorflow.keras import layers, models class Sampling(layers.Layer): 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 latent_dim = 2 encoder_inputs = tf.keras.Input(shape=(28, 28, 1)) x = layers.Flatten()(encoder_inputs) x = layers.Dense(512, activation='relu')(x) z_mean = layers.Dense(latent_dim)(x) z_log_var = layers.Dense(latent_dim)(x) z = Sampling()([z_mean, z_log_var]) encoder = tf.keras.Model(encoder_inputs, [z_mean, z_log_var, z], name="encoder") decoder_inputs = tf.keras.Input(shape=(latent_dim,)) x = layers.Dense(512, activation='relu')(decoder_inputs) x = layers.Dense(28 * 28 * 1, activation='sigmoid')(x) decoder_outputs = layers.Reshape((28, 28, 1))(x) decoder = tf.keras.Model(decoder_inputs, decoder_outputs, name="decoder") class VAE(tf.keras.Model): def __init__(self, encoder, decoder, **kwargs): super(VAE, self).__init__(**kwargs) self.encoder = encoder self.decoder = decoder def call(self, inputs): z_mean, z_log_var, z = self.encoder(inputs) reconstructed = self.decoder(z) kl_loss = -0.5 * tf.reduce_mean(z_log_var - tf.square(z_mean) - tf.exp(z_log_var) + 1) self.add_loss(kl_loss) return reconstructed vae = VAE(encoder, decoder) vae.compile(optimizer='adam', loss='binary_crossentropy') (x_train, _), (x_test, _) = tf.keras.datasets.mnist.load_data() x_train = x_train.astype("float32") / 255.0 x_train = x_train.reshape(-1, 28, 28, 1) x_test = x_test.astype("float32") / 255.0 x_test = x_test.reshape(-1, 28, 28, 1) vae.fit(x_train, x_train, epochs=30, batch_size=128, validation_data=(x_test, x_test)) __ __