“Generative adversarial networks (GANs) are an exciting recent innovation in machine learning. GANs are generative models: they create new data instances that resemble your training data. For example, GANs can create images that look like photographs of human faces, even though the faces don’t belong to any real person. “
import os import numpy as np import matplotlib.pyplot as plt from tqdm import tqdm from keras.layers import Input from keras.models import Model, Sequential from keras.layers.core import Dense, Dropout from keras.layers import LeakyReLU from keras.datasets import mnist from keras.optimizers import Adam from keras import initializers # Let Keras know that we are using tensorflow as our backend engine os.environ["KERAS_BACKEND"] = "tensorflow"
# To make sure that we can reproduce the experiment and get the same results np.random.seed(10) # The dimension of our random noise vector. random_dim = 100 def load_data(): # load the data (x_train, y_train), (x_test, y_test) = mnist.load_data() # normalize our inputs to be in the range[-1, 1] x_train = (x_train.astype(np.float32) - 127.5)/127.5 # convert x_train with a shape of (60000, 28, 28) to (60000, 784) so we have # 784 columns per row x_train = x_train.reshape(60000, 784) return (x_train, y_train, x_test, y_test) (X_train, y_train,X_test, y_test)=load_data() print(X_train.shape)
def adam_optimizer(): return Adam(lr=0.0002, beta_1=0.5)
def create_generator(): generator=Sequential() generator.add(Dense(units=256,input_dim=100)) generator.add(LeakyReLU(0.2)) generator.add(Dense(units=512)) generator.add(LeakyReLU(0.2)) generator.add(Dense(units=1024)) generator.add(LeakyReLU(0.2)) generator.add(Dense(units=784, activation='tanh')) generator.compile(loss='binary_crossentropy', optimizer=adam_optimizer()) return generator
def create_discriminator(): discriminator=Sequential() discriminator.add(Dense(units=1024,input_dim=784)) discriminator.add(LeakyReLU(0.2)) discriminator.add(Dropout(0.3)) discriminator.add(Dense(units=512)) discriminator.add(LeakyReLU(0.2)) discriminator.add(Dropout(0.3)) discriminator.add(Dense(units=256)) discriminator.add(LeakyReLU(0.2)) discriminator.add(Dense(units=1, activation='sigmoid')) discriminator.compile(loss='binary_crossentropy', optimizer=adam_optimizer()) return discriminator
def create_gan(discriminator, generator): discriminator.trainable=False gan_input = Input(shape=(100,)) x = generator(gan_input) gan_output= discriminator(x) gan= Model(inputs=gan_input, outputs=gan_output) gan.compile(loss='binary_crossentropy', optimizer='adam') return gan
def plot_generated_images(epoch, generator, examples=100, dim=(10,10), figsize=(10,10)): noise= np.random.normal(loc=0, scale=1, size=[examples, 100]) generated_images = generator.predict(noise) generated_images = generated_images.reshape(100,28,28) plt.figure(figsize=figsize) for i in range(generated_images.shape[0]): plt.subplot(dim[0], dim[1], i+1) plt.imshow(generated_images[i], interpolation='nearest') plt.axis('off') plt.tight_layout() plt.savefig('gan_generated_image %d.png' %epoch)
def training(epochs=10, batch_size=128): #Loading the data (X_train, y_train, X_test, y_test) = load_data() # batch_count = X_train.shape[0] / batch_size # Creating GAN generator= create_generator() discriminator= create_discriminator() gan = create_gan(discriminator, generator) for e in range(1,epochs+1 ): print("Epoch %d" %e) for _ in tqdm(range(batch_size)): #generate random noise as an input to initialize the generator noise= np.random.normal(0,1, [batch_size, 100]) # Generate fake MNIST images from noised input generated_images = generator.predict(noise) # Get a random set of real images image_batch =X_train[np.random.randint(low=0,high=X_train.shape[0],size=batch_size)] #Construct different batches of real and fake data X= np.concatenate([image_batch, generated_images]) # Labels for generated and real data y_dis=np.zeros(2*batch_size) y_dis[:batch_size]=0.9 #Pre train discriminator on fake and real data before starting the gan. discriminator.trainable=True discriminator.train_on_batch(X, y_dis) #Tricking the noised input of the Generator as real data noise= np.random.normal(0,1, [batch_size, 100]) y_gen = np.ones(batch_size) # During the training of gan, # the weights of discriminator should be fixed. #We can enforce that by setting the trainable flag discriminator.trainable=False #training the GAN by alternating the training of the Discriminator #and training the chained GAN model with Discriminator’s weights freezed. gan.train_on_batch(noise, y_gen) if e == 1 or e % 20 == 0: plot_generated_images(e, generator)
Now Train The Model
training(50,128)
Results
I respect your work, thankyou for all the great posts.