import tensorflow as tf from tensorflow.keras import layers, models def build_generator(): model = models.Sequential() model.add(layers.Dense(256, activation='relu', input_dim=100)) model.add(layers.BatchNormalization()) model.add(layers.Dense(512, activation='relu')) model.add(layers.BatchNormalization()) model.add(layers.Dense(1024, activation='relu')) model.add(layers.BatchNormalization()) model.add(layers.Dense(28 * 28 * 1, activation='tanh')) model.add(layers.Reshape((28, 28, 1))) return model def build_discriminator(): model = models.Sequential() model.add(layers.Flatten(input_shape=(28, 28, 1))) model.add(layers.Dense(512, activation='relu')) model.add(layers.Dense(256, activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) return model generator = build_generator() discriminator = build_discriminator() discriminator.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) gan_input = tf.keras.Input(shape=(100,)) generated_image = generator(gan_input) discriminator.trainable = False gan_output = discriminator(generated_image) gan = tf.keras.Model(gan_input, gan_output) gan.compile(optimizer='adam', loss='binary_crossentropy') (x_train, _), (_, _) = tf.keras.datasets.mnist.load_data() x_train = x_train.astype("float32") / 255.0 x_train = x_train.reshape(-1, 28, 28, 1) import numpy as np batch_size = 128 epochs = 10000 half_batch = batch_size // 2 for epoch in range(epochs): idx = np.random.randint(0, x_train.shape[0], half_batch) real_images = x_train[idx] noise = np.random.normal(0, 1, (half_batch, 100)) fake_images = generator.predict(noise) d_loss_real = discriminator.train_on_batch(real_images, np.ones((half_batch, 1))) d_loss_fake = discriminator.train_on_batch(fake_images, np.zeros((half_batch, 1))) d_loss = 0.5 * np.add(d_loss_real, d_loss_fake) noise = np.random.normal(0, 1, (batch_size, 100)) valid_y = np.array([1] * batch_size) g_loss = gan.train_on_batch(noise, valid_y) if epoch % 100 == 0: print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100*d_loss[1]}] [G loss: {g_loss}]") __ __