aravin / Auto-Gan_draft_vers
ayush-goud's picture
Upload 10 files
6f88715 verified
# Combining Autoencoders and GANs involves training both models simultaneously. The Autoencoder is responsible for reconstructing input images, while the GAN ensures that the generated images from random noise are realistic. Below is a simplified example of combining Autoencoders and GANs in Keras:
# ```python
import os
import cv2
import numpy as np
from PIL import Image
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, Dense, Reshape, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import binary_crossentropy
from tensorflow.keras.datasets import mnist # Example dataset, replace with your data
import matplotlib.pyplot as plt
# Function to load face images from a folder
def load_faces_from_folder(folder_path):
faces = []
for filename in os.listdir(folder_path):
img_path = os.path.join(folder_path, filename)
face_image = Image.open(img_path)
face_array = np.array(face_image.resize((128, 128))) / 255.0 # Normalize pixel values
faces.append(face_array)
return np.array(faces)
# Function to build the autoencoder
def build_autoencoder(input_shape):
input_img = Input(shape=input_shape)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
# Decoder
x = Conv2D(128, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='mean_squared_error')
return autoencoder
# Function to build the generator for GAN
def build_generator(latent_dim, img_shape):
model_input = Input(shape=(latent_dim,))
# Adjust the following line based on the desired output shape
x = Dense(32 * 32 * 64, activation='relu')(model_input)
x = Reshape((32, 32, 64))(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
generated_img = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
generator = Model(model_input, generated_img)
return generator
# Function to build the discriminator for GAN
def build_discriminator(img_shape):
model_input = Input(shape=img_shape)
x = Conv2D(64, (3, 3), strides=(2, 2), padding='same', activation='relu')(model_input)
x = Conv2D(128, (3, 3), strides=(2, 2), padding='same', activation='relu')(x)
x = Flatten()(x)
x = Dense(1, activation='sigmoid')(x)
discriminator = Model(model_input, x)
discriminator.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
return discriminator
# Function to build the GAN model
# Function to build the GAN model
def build_gan(generator, discriminator, autoencoder, latent_dim):
discriminator.trainable = False
gan_input = Input(shape=(latent_dim,))
generated_img = generator(gan_input)
validity = discriminator(autoencoder(generated_img))
gan = Model(gan_input, validity)
gan.compile(optimizer='adam', loss='binary_crossentropy')
return gan
# Function to train Autoencoder-GAN
def train_autoencoder_gan(autoencoder, generator, discriminator, gan, x_train, epochs=100, batch_size=128):
latent_dim = 100 # Adjust based on your requirements
# Training loop
for epoch in range(epochs):
idx = np.random.randint(0, x_train.shape[0], batch_size)
real_imgs = x_train[idx]
# Generate random noise as input to the generator
noise = np.random.normal(0, 1, (batch_size, latent_dim))
generated_imgs = generator.predict(noise)
# Train discriminator
d_loss_real = discriminator.train_on_batch(real_imgs, np.ones((batch_size, 1)))
d_loss_fake = discriminator.train_on_batch(generated_imgs, np.zeros((batch_size, 1)))
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
# Train generator (via the gan model)
noise = np.random.normal(0, 1, (batch_size, latent_dim))
valid_y = np.array([1] * batch_size)
g_loss = gan.train_on_batch(noise, valid_y)
# Print progress
print(f"Epoch {epoch}/{epochs} [D loss: {d_loss[0]} | D accuracy: {100 * d_loss[1]}] [G loss: {g_loss}]")
if __name__ == "__main__":
# Specify the output folder containing the face images
faces_folder = "/content/drive/MyDrive/dataset_major/dataset" # Change this to your actual output folder
# Load face images
faces = load_faces_from_folder(faces_folder)
# Build Autoencoder, Generator, Discriminator, and GAN
autoencoder = build_autoencoder(input_shape=(128, 128, 3))
generator = build_generator(latent_dim=100, img_shape=(128, 128, 3))
discriminator = build_discriminator(img_shape=(128, 128, 3))
gan = build_gan(generator, discriminator, autoencoder, latent_dim=100)
# Train Autoencoder-GAN
train_autoencoder_gan(autoencoder, generator, discriminator, gan, faces, epochs=5, batch_size=128)
# Generate some images using the trained generator
num_generated_images = 5
latent_dim = 100
noise = np.random.normal(0, 1, (num_generated_images, latent_dim))
generated_images = generator.predict(noise)
# Display the generated images
fig, axes = plt.subplots(1, num_generated_images, figsize=(15, 3))
for i in range(num_generated_images):
axes[i].imshow(generated_images[i])
axes[i].axis('off')
axes[i].set_title(f"Generated Image {i+1}")
plt.show()