def build_and_train_models(): # load MNIST dataset (x_train, y_train), (_, _) = mnist.load_data() # reshape data for CNN as (28, 28, 1) and normalize image_size = x_train.shape[1] x_train = np.reshape(x_train, [-1, image_size, image_size, 1]) x_train = x_train.astype('float32') / 255 # train labels num_labels = len(np.unique(y_train)) y_train = to_categorical(y_train) model_name = "acgan_mnist" # network parameters latent_size = 100 batch_size = 64 train_steps = 40000 lr = 2e-4 decay = 6e-8 input_shape = (image_size, image_size, 1) label_shape = (num_labels, ) # build discriminator Model inputs = Input(shape=input_shape, name='discriminator_input') # call discriminator builder with 2 outputs, pred source and labels discriminator = gan.discriminator(inputs, num_labels=num_labels) # [1] uses Adam, but discriminator converges easily with RMSprop optimizer = RMSprop(lr=lr, decay=decay) # 2 loss fuctions: 1) probability image is real # 2) class label of the image loss = ['binary_crossentropy', 'categorical_crossentropy'] discriminator.compile(loss=loss, optimizer=optimizer, metrics=['accuracy']) discriminator.summary() # build generator model input_shape = (latent_size, ) inputs = Input(shape=input_shape, name='z_input') labels = Input(shape=label_shape, name='labels') # call generator builder with input labels generator = gan.generator(inputs, image_size, labels=labels) generator.summary() # build adversarial model = generator + discriminator optimizer = RMSprop(lr=lr * 0.5, decay=decay * 0.5) # freeze the weights of discriminator during adversarial training discriminator.trainable = False adversarial = Model([inputs, labels], discriminator(generator([inputs, labels])), name=model_name) # same 2 loss fuctions: 1) probability image is real # 2) class label of the image adversarial.compile(loss=loss, optimizer=optimizer, metrics=['accuracy']) adversarial.summary() # train discriminator and adversarial networks models = (generator, discriminator, adversarial) data = (x_train, y_train) params = (batch_size, latent_size, train_steps, num_labels, model_name) train(models, data, params)
def build_and_train_models(): # load MNIST dataset (x_train, _), (_, _) = mnist.load_data() # reshape data for CNN as (28, 28, 1) and normalize image_size = x_train.shape[1] x_train = np.reshape(x_train, [-1, image_size, image_size, 1]) x_train = x_train.astype('float32') / 255 model_name = "wgan_mnist" # network parameters # the latent or z vector is 100-dim latent_size = 100 # hyper parameters from WGAN paper [2] n_critic = 5 clip_value = 0.01 batch_size = 64 lr = 5e-5 train_steps = 40000 input_shape = (image_size, image_size, 1) # build discriminator model inputs = Input(shape=input_shape, name='discriminator_input') # WGAN uses linear activation in paper [2] discriminator = gan.discriminator(inputs, activation='linear') optimizer = RMSprop(lr=lr) # WGAN discriminator uses wassertein loss discriminator.compile(loss=wasserstein_loss, optimizer=optimizer, metrics=['accuracy']) discriminator.summary() # build generator model input_shape = (latent_size, ) inputs = Input(shape=input_shape, name='z_input') generator = gan.generator(inputs, image_size) generator.summary() # build adversarial model = generator + discriminator # freeze the weights of discriminator during adversarial training discriminator.trainable = False adversarial = Model(inputs, discriminator(generator(inputs)), name=model_name) adversarial.compile(loss=wasserstein_loss, optimizer=optimizer, metrics=['accuracy']) adversarial.summary() # train discriminator and adversarial networks models = (generator, discriminator, adversarial) params = (batch_size, latent_size, n_critic, clip_value, train_steps, model_name) train(models, x_train, params)
def build_and_train_models(): """Load the dataset, build LSGAN discriminator, generator, and adversarial models. Call the LSGAN train routine. """ # load MNIST dataset (x_train, _), (_, _) = mnist.load_data() # reshape data for CNN as (28, 28, 1) and normalize image_size = x_train.shape[1] x_train = np.reshape(x_train, [-1, image_size, image_size, 1]) x_train = x_train.astype('float32') / 255 model_name = "lsgan_mnist" # network parameters # the latent or z vector is 100-dim latent_size = 100 input_shape = (image_size, image_size, 1) batch_size = 64 lr = 2e-4 decay = 6e-8 train_steps = 40000 # build discriminator model inputs = Input(shape=input_shape, name='discriminator_input') discriminator = gan.discriminator(inputs, activation=None) # [1] uses Adam, but discriminator easily # converges with RMSprop optimizer = RMSprop(lr=lr, decay=decay) # LSGAN uses MSE loss [2] discriminator.compile(loss='mse', optimizer=optimizer, metrics=['accuracy']) discriminator.summary() # build generator model input_shape = (latent_size, ) inputs = Input(shape=input_shape, name='z_input') generator = gan.generator(inputs, image_size) generator.summary() # build adversarial model = generator + discriminator optimizer = RMSprop(lr=lr * 0.5, decay=decay * 0.5) # freeze the weights of discriminator # during adversarial training discriminator.trainable = False adversarial = Model(inputs, discriminator(generator(inputs)), name=model_name) # LSGAN uses MSE loss [2] adversarial.compile(loss='mse', optimizer=optimizer, metrics=['accuracy']) adversarial.summary() # train discriminator and adversarial networks models = (generator, discriminator, adversarial) params = (batch_size, latent_size, train_steps, model_name) gan.train(models, x_train, params)
def build_generator(latent_codes, image_size, feature1_dim=256): """Build Generator Model sub networks Two sub networks: 1) Class and noise to feature1 (intermediate feature) 2) feature1 to image # Arguments latent_codes (Layers): dicrete code (labels), noise and feature1 features image_size (int): Target size of one side (assuming square image) feature1_dim (int): feature1 dimensionality # Returns gen0, gen1 (Models): Description below """ # Latent codes and network parameters labels, z0, z1, feature1 = latent_codes # image_resize = image_size // 4 # kernel_size = 5 # layer_filters = [128, 64, 32, 1] # gen1 inputs inputs = [labels, z1] # 10 + 50 = 62-dim x = concatenate(inputs, axis=1) x = Dense(512, activation='relu')(x) x = BatchNormalization()(x) x = Dense(512, activation='relu')(x) x = BatchNormalization()(x) fake_feature1 = Dense(feature1_dim, activation='relu')(x) # gen1: classes and noise (feature2 + z1) to feature1 gen1 = Model(inputs, fake_feature1, name='gen1') # gen0: feature1 + z0 to feature0 (image) gen0 = gan.generator(feature1, image_size, codes=z0) return gen0, gen1
def build_and_train_models(latent_size=100): # load MNIST dataset (x_train, y_train), (_, _) = mnist.load_data() # reshape data for CNN as (28, 28, 1) and normalize image_size = x_train.shape[1] x_train = np.reshape(x_train, [-1, image_size, image_size, 1]) x_train = x_train.astype('float32') / 255 # train labels num_labels = len(np.unique(y_train)) y_train = to_categorical(y_train) model_name = "infogan_mnist" # network parameters batch_size = 64 train_steps = 40000 lr = 2e-4 decay = 6e-8 input_shape = (image_size, image_size, 1) label_shape = (num_labels, ) code_shape = (1, ) # build discriminator model inputs = Input(shape=input_shape, name='discriminator_input') # call discriminator builder with 4 outputs: # source, label, and 2 codes discriminator = gan.discriminator(inputs, num_labels=num_labels, num_codes=2) # [1] uses Adam, but discriminator converges easily with RMSprop optimizer = RMSprop(lr=lr, decay=decay) # loss functions: 1) probability image is real # (binary crossentropy) # 2) categorical cross entropy image label, # 3) and 4) mutual information loss loss = [ 'binary_crossentropy', 'categorical_crossentropy', mi_loss, mi_loss ] # lamda or mi_loss weight is 0.5 loss_weights = [1.0, 1.0, 0.5, 0.5] discriminator.compile(loss=loss, loss_weights=loss_weights, optimizer=optimizer, metrics=['accuracy']) discriminator.summary() # build generator model input_shape = (latent_size, ) inputs = Input(shape=input_shape, name='z_input') labels = Input(shape=label_shape, name='labels') code1 = Input(shape=code_shape, name="code1") code2 = Input(shape=code_shape, name="code2") # call generator with inputs, # labels and codes as total inputs to generator generator = gan.generator(inputs, image_size, labels=labels, codes=[code1, code2]) generator.summary() # build adversarial model = generator + discriminator optimizer = RMSprop(lr=lr * 0.5, decay=decay * 0.5) discriminator.trainable = False # total inputs = noise code, labels, and codes inputs = [inputs, labels, code1, code2] adversarial = Model(inputs, discriminator(generator(inputs)), name=model_name) # same loss as discriminator adversarial.compile(loss=loss, loss_weights=loss_weights, optimizer=optimizer, metrics=['accuracy']) adversarial.summary() # train discriminator and adversarial networks models = (generator, discriminator, adversarial) data = (x_train, y_train) params = (batch_size, latent_size, train_steps, num_labels, model_name) train(models, data, params)