pip install tensorflow
pip install numpy
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.layers import Dense, Flatten, Reshape
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
def build_generator():
model = Sequential()
model.add(Dense(128, input_dim=100, activation='relu'))
model.add(Dense(784, activation='sigmoid'))
model.add(Reshape((28, 28, 1)))
return model
def build_discriminator():
model = Sequential()
model.add(Flatten(input_shape=(28, 28, 1)))
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
return model
def build_gan(generator, discriminator):
discriminator.trainable = False
gan = Sequential()
gan.add(generator)
gan.add(discriminator)
gan.compile(loss='binary_crossentropy', optimizer='adam')
return gan
def train_gan(generator, discriminator, gan, noise_dim=100, num_epochs=10000, batch_size=32):
for epoch in range(num_epochs):
noise = np.random.normal(0, 1, (batch_size, noise_dim))
generated_images = generator.predict(noise)
real_images = ... # Load real images from your dataset
# Labels for real and generated images
labels_real = np.ones((batch_size, 1))
labels_fake = np.zeros((batch_size, 1))
# Train the discriminator
d_loss_real = discriminator.train_on_batch(real_images, labels_real)
d_loss_fake = discriminator.train_on_batch(generated_images, labels_fake)
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
# Train the generator
noise = np.random.normal(0, 1, (batch_size, noise_dim))
labels_gan = np.ones((batch_size, 1))
g_loss = gan.train_on_batch(noise, labels_gan)
# Print progress
print(f"Epoch {epoch}, D Loss: {d_loss[0]}, G Loss: {g_loss}")
# Save generated images at specific intervals
if epoch % save_interval == 0:
save_generated_images(epoch, generator)
def save_generated_images(epoch, generator, examples=10, dim=(1, 10), figsize=(10, 1)):
noise = np.random.normal(0, 1, (examples, 100))
generated_images = generator.predict(noise)
plt.figure(figsize=figsize)
for i in range(examples):
plt.subplot(dim[0], dim[1], i+1)
plt.imshow(generated_images[i], interpolation='nearest', cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.savefig(f'gan_generated_image_epoch_{epoch}.png')
if __name__ == "__main__":
# Build and compile the models
generator = build_generator()
discriminator = build_discriminator()
gan = build_gan(generator, discriminator)
# Train the GAN
train_gan(generator, discriminator, gan)