import tensorflow as tf
from [Link] import layers
import numpy as np
import [Link] as plt
# 1. Load and preprocess MNIST dataset
(x_train, _), (_, _) = [Link].load_data()
# Normalize to [-1, 1] for GAN
x_train = (x_train - 127.5) / 127.5
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
BUFFER_SIZE = 60000
BATCH_SIZE = 256
dataset =
[Link].from_tensor_slices(x_train).shuffle(BUFFER_SIZE).batch(BAT
CH_SIZE)
# 2. Build Generator
def build_generator():
model = [Link]([
[Link](256, use_bias=False, input_shape=(100,)),
[Link](),
[Link](),
[Link](512),
[Link](),
[Link](),
[Link](1024),
[Link](),
[Link](),
[Link](28*28*1, activation='tanh'),
[Link]((28, 28, 1))
])
return model
# 3. Build Discriminator
def build_discriminator():
model = [Link]([
[Link](input_shape=(28, 28, 1)),
[Link](512),
[Link](),
[Link](256),
[Link](),
[Link](1, activation='sigmoid')
])
return model
generator = build_generator()
discriminator = build_discriminator()
# 4. Loss and Optimizers
cross_entropy = [Link]()
def generator_loss(fake_output):
return cross_entropy(tf.ones_like(fake_output), fake_output)
def discriminator_loss(real_output, fake_output):
real_loss = cross_entropy(tf.ones_like(real_output), real_output)
fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
return real_loss + fake_loss
generator_optimizer = [Link](1e-4)
discriminator_optimizer = [Link](1e-4)
# 5. Training Step
@[Link]
def train_step(images):
noise = [Link]([BATCH_SIZE, 100])
with [Link]() as gen_tape, [Link]() as disc_tape:
generated_images = generator(noise, training=True)
real_output = discriminator(images, training=True)
fake_output = discriminator(generated_images, training=True)
gen_loss = generator_loss(fake_output)
disc_loss = discriminator_loss(real_output, fake_output)
gradients_gen = gen_tape.gradient(gen_loss,
generator.trainable_variables)
gradients_disc = disc_tape.gradient(disc_loss,
discriminator.trainable_variables)
generator_optimizer.apply_gradients(zip(gradients_gen,
generator.trainable_variables))
discriminator_optimizer.apply_gradients(zip(gradients_disc,
discriminator.trainable_variables))
# 6. Training Loop
EPOCHS = 50
noise_dim = 100
num_examples_to_generate = 16
seed = [Link]([num_examples_to_generate, noise_dim])
def generate_and_save_images(model, epoch, test_input):
predictions = model(test_input, training=False)
fig = [Link](figsize=(4,4))
for i in range([Link][0]):
[Link](4, 4, i+1)
[Link](predictions[i, :, :, 0] * 127.5 + 127.5, cmap='gray')
[Link]('off')
[Link]()
def train(dataset, epochs):
for epoch in range(epochs):
for image_batch in dataset:
train_step(image_batch)
print(f"Epoch {epoch+1} completed")
generate_and_save_images(generator, epoch+1, seed)
# 7. Run Training
train(dataset, EPOCHS)