def train_cs_modis_cgan( scenes_fn=None, noise_dim=64, epoch=1, model_name="cs_modis_cgan", num_epochs=1, batch_size=32, noise_scale=1.0, cs_scenes=None, modis_vars=None, modis_mask=None, save_every=5, lr_disc=0.0001, lr_gan=0.0002, ): # Load and rescale data if cs_scenes is None: print("Loading data...") (cs_scenes, modis_vars, modis_mask) = \ data_utils.load_cloudsat_scenes(scenes_fn) num_scenes = cs_scenes.shape[0] batches_per_epoch = num_scenes // batch_size scene_size = cs_scenes.shape[1] modis_var_dim = modis_vars.shape[-1] print("Creating models...") (gen, disc, gan, opt_disc, opt_gan) = create_models(scene_size, modis_var_dim, noise_dim, lr_disc, lr_gan) if epoch > 1: print("Loading weights...") load_model_state(gen, disc, gan, model_name, epoch - 1) # Start training print("Starting training...") for e in range(epoch, epoch + num_epochs): # Initialize progbar and batch counter progbar = generic_utils.Progbar(num_scenes) batch_counter = 1 start = time.time() batch_gen = data_utils.gen_batch(cs_scenes, modis_vars, modis_mask, batch_size) for (cs_scenes_b, modis_vars_b, modis_mask_b) in batch_gen: disc_loss = 0 for fake in [False, True]: # Create a batch to feed the discriminator model (X_disc, y_disc) = data_utils.get_disc_batch( cs_scenes_b, modis_vars_b, modis_mask_b, gen, fake, batch_size, noise_dim, #cont_dim, noise_scale=noise_scale) # Train the discriminator disc_loss += disc.train_on_batch(X_disc, y_disc) disc_loss /= 2 # Create a batch to feed the generator model (X_gan, y_gan_disc) = data_utils.get_gan_batch( batch_size, noise_dim, #cont_dim, noise_scale=noise_scale) noise = X_gan #(noise, cont) = X_gan # Freeze the discriminator while training the generator disc.trainable = False gen_loss = gan.train_on_batch([noise, modis_vars_b, modis_mask_b], [y_gan_disc]) disc.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D loss", disc_loss), ("G loss", gen_loss)]) if batch_counter % 50 == 0: scene_gen = gen.predict([noise, modis_vars_b, modis_mask_b]) modis_vars_bs = np.zeros_like(modis_vars_b) modis_mask_bs = np.zeros_like(modis_mask_b) for i in range(1, batch_size): modis_vars_bs[i, ...] = modis_vars_b[0, ...] modis_mask_bs[i, ...] = modis_mask_b[0, ...] scene_gen_s = gen.predict( [noise, modis_vars_bs, modis_mask_bs]) np.savez_compressed(dir_path + "/../data/gen_scene.npz", scene=scene_gen, real_scene=cs_scenes_b, scene_single=scene_gen_s, modis_vars=modis_vars_b, modis_mask=modis_mask_b) gc.collect() print("") print('Epoch %s/%s, Time: %s' % (e, epoch + num_epochs - 1, time.time() - start)) if (e % save_every == 0): print("Saving weights...") save_model_state(gen, disc, gan, model_name, e) return (gan, gen, disc)
def train(**kwargs): """ Train standard DCGAN model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters generator = kwargs["generator"] dset = kwargs["dset"] img_dim = kwargs["img_dim"] nb_epoch = kwargs["nb_epoch"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] bn_mode = kwargs["bn_mode"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] image_dim_ordering = kwargs["image_dim_ordering"] epoch_size = n_batch_per_epoch * batch_size print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("DCGAN") # Load and normalize data X_real_train = data_utils.load_image_dataset(dset, img_dim, image_dim_ordering) # Get the full real image dimension img_dim = X_real_train.shape[-3:] # Create optimizers opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_D = data_utils.get_optimizer(opt_D, lr_D) ####################### # Load models ####################### noise_dim = (noise_dim, ) if generator == "upsampling": generator_model = models.generator_upsampling(noise_dim, img_dim, bn_mode, dset=dset) else: generator_model = models.generator_deconv(noise_dim, img_dim, bn_mode, batch_size, dset=dset) discriminator_model = models.discriminator(img_dim, bn_mode, dset=dset) DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_dim) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) discriminator_model.trainable = False DCGAN_model.compile(loss=models.wasserstein, optimizer=opt_G) discriminator_model.trainable = True discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) # Global iteration counter for generator updates gen_iterations = 0 ################# # Start training ################ for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: if gen_iterations < 25 or gen_iterations % 500 == 0: disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] for disc_it in range(disc_iterations): # Clip discriminator weights for l in discriminator_model.layers: weights = l.get_weights() weights = [ np.clip(w, clamp_lower, clamp_upper) for w in weights ] l.set_weights(weights) X_real_batch = next( data_utils.gen_batch(X_real_train, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch( X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale) # Update the discriminator disc_loss_real = discriminator_model.train_on_batch( X_disc_real, -np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch( X_disc_gen, np.ones(X_disc_gen.shape[0])) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator ####################### X_gen = X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, -np.ones(X_gen.shape[0])) # Unfreeze the discriminator discriminator_model.trainable = True gen_iterations += 1 batch_counter += 1 progbar.add(batch_size, values=[("Loss_D", -np.mean(list_disc_loss_real) - np.mean(list_disc_loss_gen)), ("Loss_D_real", -np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", -gen_loss)]) # Save images for visualization ~2 times per epoch if batch_counter % (n_batch_per_epoch / 2) == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, batch_size, noise_dim, image_dim_ordering) print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) # Save model weights (by default, every 5 epochs) data_utils.save_model_weights(generator_model, discriminator_model, DCGAN_model, e)
def train_toy(**kwargs): """ Train model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] epoch_size = n_batch_per_epoch * batch_size print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("toy_MLP") # Load and rescale data X_real_train = data_utils.load_toy() # Create optimizers opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_D = data_utils.get_optimizer(opt_D, lr_D) ####################### # Load models ####################### noise_dim = (noise_dim, ) generator_model = models.generator_toy(noise_dim) discriminator_model = models.discriminator_toy() GAN_model = models.GAN_toy(generator_model, discriminator_model, noise_dim) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) discriminator_model.trainable = False GAN_model.compile(loss=models.wasserstein, optimizer=opt_G) discriminator_model.trainable = True discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) # Global iteration counter for generator updates gen_iterations = 0 ################# # Start training ################# for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] for disc_it in range(disc_iterations): # Clip discriminator weights for l in discriminator_model.layers: weights = l.get_weights() weights = [ np.clip(w, clamp_lower, clamp_upper) for w in weights ] l.set_weights(weights) X_real_batch = next( data_utils.gen_batch(X_real_train, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch( X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale) # Update the discriminator disc_loss_real = discriminator_model.train_on_batch( X_disc_real, -np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch( X_disc_gen, np.ones(X_disc_gen.shape[0])) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) # Freeze the discriminator discriminator_model.trainable = False gen_loss = GAN_model.train_on_batch(X_gen, -np.ones(X_gen.shape[0])) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("Loss_D", -np.mean(list_disc_loss_real) - np.mean(list_disc_loss_gen)), ("Loss_D_real", -np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", -gen_loss)]) # # Save images for visualization if gen_iterations % 50 == 0: data_utils.plot_generated_toy_batch(X_real_train, generator_model, discriminator_model, noise_dim, gen_iterations) gen_iterations += 1 print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start))
def train_toy(**kwargs): """ Train model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] epoch_size = n_batch_per_epoch * batch_size print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("toy_MLP") # Load and rescale data X_real_train = data_utils.load_toy() # Create optimizers opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_D = data_utils.get_optimizer(opt_D, lr_D) ####################### # Load models ####################### noise_dim = (noise_dim,) generator_model = models.generator_toy(noise_dim) discriminator_model = models.discriminator_toy() GAN_model = models.GAN_toy(generator_model, discriminator_model, noise_dim) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) discriminator_model.trainable = False GAN_model.compile(loss=models.wasserstein, optimizer=opt_G) discriminator_model.trainable = True discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) # Global iteration counter for generator updates gen_iterations = 0 ################# # Start training ################# for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] for disc_it in range(disc_iterations): # Clip discriminator weights for l in discriminator_model.layers: weights = l.get_weights() weights = [np.clip(w, clamp_lower, clamp_upper) for w in weights] l.set_weights(weights) X_real_batch = next(data_utils.gen_batch(X_real_train, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch(X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale) # Update the discriminator disc_loss_real = discriminator_model.train_on_batch(X_disc_real, -np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch(X_disc_gen, np.ones(X_disc_gen.shape[0])) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) # Freeze the discriminator discriminator_model.trainable = False gen_loss = GAN_model.train_on_batch(X_gen, -np.ones(X_gen.shape[0])) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("Loss_D", -np.mean(list_disc_loss_real) - np.mean(list_disc_loss_gen)), ("Loss_D_real", -np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", -gen_loss)]) # # Save images for visualization if gen_iterations % 50 == 0: data_utils.plot_generated_toy_batch(X_real_train, generator_model, discriminator_model, noise_dim, gen_iterations) gen_iterations += 1 print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start))
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] model_name = kwargs["model_name"] generator = kwargs["generator"] image_dim_ordering = kwargs["image_dim_ordering"] img_dim = kwargs["img_dim"] patch_size = kwargs["patch_size"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["use_label_smoothing"] label_flipping = kwargs["label_flipping"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) general_utils.setup_logging(model_name) print "hi" # Load and rescale data X_full_train, X_sketch_train, X_full_val, X_sketch_val = data_utils.load_data( dset, image_dim_ordering) img_dim = X_full_train.shape[-3:] print "data loaded in memory" # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_dim_ordering) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model generator_model = models.load("generator_unet_%s" % generator, img_dim, nb_patch, bn_mode, use_mbd, batch_size) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, bn_mode, use_mbd, batch_size) generator_model.compile(loss='mae', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_dim_ordering) loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = None disc_loss = None iter_num = 102 weights_path = "/home/abhik/pix2pix/src/model/weights/gen_weights_iter%s_epoch30.h5" % ( str(iter_num - 1)) print weights_path generator_model.load_weights(weights_path) #discriminator_model.load_weights("disc_weights1.2.h5") #DCGAN_model.load_weights("DCGAN_weights1.2.h5") print("Weights Loaded for iter - %d" % iter_num) # Running average losses_list = list() # loss_list = list() # prev_avg = 0 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() # global disc_n, disc_prev_avg, gen1_n, gen1_prev_avg, gen2_n, gen2_prev_avg, gen3_n, gen3_prev_avg # disc_n = 1 # disc_prev_avg = 0 # gen1_n = 1 # gen1_prev_avg = 0 # gen2_n = 1 # gen2_prev_avg = 0 # gen3_n = 1 # gen3_prev_avg = 0 for X_full_batch, X_sketch_batch in data_utils.gen_batch( X_full_train, X_sketch_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch( X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_dim_ordering, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = next( data_utils.gen_batch(X_full_train, X_sketch_train, batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True # Running average # loss_list.append(disc_loss) # loss_list_n = len(loss_list) # new_avg = ((loss_list_n-1)*prev_avg + disc_loss)/loss_list_n # prev_avg = new_avg # disc_avg, gen1_avg, gen2_avg, gen3_avg = running_avg(disc_loss, gen_loss[0], gen_loss[1], gen_loss[2]) # print("running disc loss", new_avg) # print(disc_loss, gen_loss) # print ("all losses", disc_avg, gen1_avg, gen2_avg, gen3_avg) # print("") batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G tot", gen_loss[0]), ("G L1", gen_loss[1]), ("G logloss", gen_loss[2])]) # Saving data for plotting # losses = [e+1, batch_counter, disc_loss, gen_loss[0], gen_loss[1], gen_loss[2], disc_avg, gen1_avg, gen2_avg, gen3_avg, iter_num] # losses_list.append(losses) # Save images for visualization if batch_counter % (n_batch_per_epoch / 2) == 0: # Get new images from validation data_utils.plot_generated_batch( X_full_batch, X_sketch_batch, generator_model, batch_size, image_dim_ordering, "training", iter_num) X_full_batch, X_sketch_batch = next( data_utils.gen_batch(X_full_val, X_sketch_val, batch_size)) data_utils.plot_generated_batch( X_full_batch, X_sketch_batch, generator_model, batch_size, image_dim_ordering, "validation", iter_num) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) #Running average disc_avg, gen1_avg, gen2_avg, gen3_avg = running_avg( disc_loss, gen_loss[0], gen_loss[1], gen_loss[2]) #Validation loss y_gen_val = np.zeros((X_sketch_batch.shape[0], 2), dtype=np.uint8) y_gen_val[:, 1] = 1 val_loss = DCGAN_model.test_on_batch(X_full_batch, [X_sketch_batch, y_gen_val]) # print "val_loss ===" + str(val_loss) #logging # Saving data for plotting losses = [ e + 1, iter_num, disc_loss, gen_loss[0], gen_loss[1], gen_loss[2], disc_avg, gen1_avg, gen2_avg, gen3_avg, val_loss[0], val_loss[1], val_loss[2] ] losses_list.append(losses) if (e + 1) % 5 == 0: gen_weights_path = os.path.join( '../../models/%s/gen_weights_iter%s_epoch%s.h5' % (model_name, iter_num, e + 1)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join( '../../models/%s/disc_weights_iter%s_epoch%s.h5' % (model_name, iter_num, e + 1)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join( '../../models/%s/DCGAN_weights_iter%s_epoch%s.h5' % (model_name, iter_num, e + 1)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) loss_array = np.asarray(losses_list) print(loss_array.shape) # 10 element vector loss_path = os.path.join( '../../losses/loss_iter%s_epoch%s.csv' % (iter_num, e + 1)) np.savetxt(loss_path, loss_array, fmt='%.5f', delimiter=',') np.savetxt('test.csv', loss_array, fmt='%.5f', delimiter=',') except KeyboardInterrupt: pass
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] generator = kwargs["generator"] model_name = kwargs["model_name"] image_data_format = kwargs["image_data_format"] img_dim = kwargs["img_dim"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["label_smoothing"] label_flipping = kwargs["label_flipping"] noise_scale = kwargs["noise_scale"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) general_utils.setup_logging(model_name) # Load and rescale data if dset == "celebA": X_real_train = data_utils.load_celebA(img_dim, image_data_format) if dset == "mnist": X_real_train, _, _, _ = data_utils.load_mnist(image_data_format) img_dim = X_real_train.shape[-3:] noise_dim = (100, ) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.5, beta_2=0.999, epsilon=1e-08) opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) # Load generator model generator_model = models.load("generator_%s" % generator, noise_dim, img_dim, bn_mode, batch_size, dset=dset, use_mbd=use_mbd) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", noise_dim, img_dim, bn_mode, batch_size, dset=dset, use_mbd=use_mbd) generator_model.compile(loss='mse', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_dim) loss = ['binary_crossentropy'] loss_weights = [1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_real_batch in data_utils.gen_batch(X_real_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch( X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen, y_gen = data_utils.get_gen_batch( batch_size, noise_dim, noise_scale=noise_scale) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, y_gen) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G logloss", gen_loss)]) # Save images for visualization if batch_counter % 100 == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, batch_size, noise_dim, image_data_format) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) if e % 5 == 0: gen_weights_path = os.path.join( '../../models/%s/gen_weights_epoch%s.h5' % (model_name, e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join( '../../models/%s/disc_weights_epoch%s.h5' % (model_name, e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join( '../../models/%s/DCGAN_weights_epoch%s.h5' % (model_name, e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) except KeyboardInterrupt: pass
def train(**kwargs): """ Train standard DCGAN model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters generator = kwargs["generator"] discriminator = kwargs["discriminator"] dset = kwargs["dset"] img_dim = kwargs["img_dim"] nb_epoch = kwargs["nb_epoch"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] bn_mode = kwargs["bn_mode"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] use_mbd = kwargs["use_mbd"] image_dim_ordering = kwargs["image_dim_ordering"] epoch_size = n_batch_per_epoch * batch_size deterministic = kwargs["deterministic"] inject_noise = kwargs["inject_noise"] model = kwargs["model"] no_supertrain = kwargs["no_supertrain"] pureGAN = kwargs["pureGAN"] lsmooth = kwargs["lsmooth"] disc_type = kwargs["disc_type"] resume = kwargs["resume"] name = kwargs["name"] wd = kwargs["wd"] history_size = kwargs["history_size"] monsterClass = kwargs["monsterClass"] print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("DCGAN") # Load and normalize data if dset == "mnistM": X_source_train, Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='mnist') # X_source_train=np.concatenate([X_source_train,X_source_train,X_source_train], axis=1) # X_source_test=np.concatenate([X_source_test,X_source_test,X_source_test], axis=1) X_dest_train, Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='mnistM') elif dset == "OfficeDslrToAmazon": X_source_train, Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='OfficeDslr') X_dest_train, Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='OfficeAmazon') else: print "dataset not supported" if n_classes1 != n_classes2: #sanity check print "number of classes mismatch between source and dest domains" n_classes = n_classes1 # img_source_dim = X_source_train.shape[-3:] # is it backend agnostic? img_dest_dim = X_dest_train.shape[-3:] # Create optimizers opt_D = data_utils.get_optimizer(opt_D, lr_D) opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_GC = data_utils.get_optimizer('Adam', lr_G / 10.0) opt_C = data_utils.get_optimizer('Adam', lr_D) opt_Z = data_utils.get_optimizer('Adam', lr_G) ####################### # Load models ####################### noise_dim = (noise_dim, ) generator_model = models.generator_google_mnistM(noise_dim, img_source_dim, img_dest_dim, deterministic, pureGAN, wd) # discriminator_model = models.discriminator_google_mnistM(img_dest_dim, wd) discriminator_model = models.discriminator_dcgan(img_dest_dim, wd, n_classes, disc_type) classificator_model = models.classificator_google_mnistM( img_dest_dim, n_classes, wd) DCGAN_model = models.DCGAN_naive(generator_model, discriminator_model, noise_dim, img_source_dim) zclass_model = z_coerence(generator_model, img_source_dim, bn_mode, wd, inject_noise, n_classes, noise_dim, model_name="zClass") # GenToClassifier_model = models.GenToClassifierModel(generator_model, classificator_model, noise_dim, img_source_dim) #disc_penalty_model = models.disc_penalty(discriminator_model,noise_dim,img_source_dim,opt_D,model_name="disc_penalty_model") zclass_model = z_coerence(generator_model, img_source_dim, bn_mode, wd, inject_noise, n_classes, noise_dim, model_name="zClass") ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) models.make_trainable(discriminator_model, False) models.make_trainable(classificator_model, False) # models.make_trainable(disc_penalty_model, False) if model == 'wgan': DCGAN_model.compile(loss=models.wasserstein, optimizer=opt_G) models.make_trainable(discriminator_model, True) # models.make_trainable(disc_penalty_model, True) discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) if model == 'lsgan': if disc_type == "simple_disc": DCGAN_model.compile(loss=['mse'], optimizer=opt_G) models.make_trainable(discriminator_model, True) discriminator_model.compile(loss=['mse'], optimizer=opt_D) elif disc_type == "nclass_disc": DCGAN_model.compile(loss=['mse', 'categorical_crossentropy'], loss_weights=[1.0, 0.1], optimizer=opt_G) models.make_trainable(discriminator_model, True) discriminator_model.compile( loss=['mse', 'categorical_crossentropy'], loss_weights=[1.0, 0.1], optimizer=opt_D) # GenToClassifier_model.compile(loss='categorical_crossentropy', optimizer=opt_GC) models.make_trainable(classificator_model, True) classificator_model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer=opt_C) zclass_model.compile(loss=['mse'], optimizer=opt_Z) visualize = True ######## #MAKING TRAIN+TEST numpy array for global testing: ######## Xtarget_dataset = np.concatenate([X_dest_train, X_dest_test], axis=0) Ytarget_dataset = np.concatenate([Y_dest_train, Y_dest_test], axis=0) if resume: ########loading previous saved model weights and checking actual performance data_utils.load_model_weights(generator_model, discriminator_model, DCGAN_model, name, classificator_model, zclass_model) # data_utils.load_model_weights(generator_model, discriminator_model, DCGAN_model, name,classificator_model) # loss4, acc4 = classificator_model.evaluate(Xtarget_dataset, Ytarget_dataset,batch_size=1024, verbose=0) # print('\n Classifier Accuracy on full target domain: %.2f%%' % (100 * acc4)) else: X_gen = data_utils.sample_noise(noise_scale, X_source_train.shape[0], noise_dim) zclass_loss = zclass_model.fit([X_gen, X_source_train], [X_gen], batch_size=256, epochs=10) ####train zclass regression model only if not resuming: gen_iterations = 0 max_history_size = int(history_size * batch_size) img_buffer = ImageHistoryBuffer((0, ) + img_source_dim, max_history_size, batch_size, n_classes) ################# # Start training ################ for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: if no_supertrain is None: if (gen_iterations < 25) and (not resume): disc_iterations = 100 if gen_iterations % 500 == 0: disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] else: if (gen_iterations < 25) and (not resume): disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = deque(10 * [0], 10) list_disc_loss_gen = deque(10 * [0], 10) list_gen_loss = deque(10 * [0], 10) list_zclass_loss = deque(10 * [0], 10) list_classifier_loss = deque(10 * [0], 10) list_gp_loss = deque(10 * [0], 10) for disc_it in range(disc_iterations): X_dest_batch, Y_dest_batch, idx_dest_batch = next( data_utils.gen_batch(X_dest_train, Y_dest_train, batch_size)) X_source_batch, Y_source_batch, idx_source_batch = next( data_utils.gen_batch(X_source_train, Y_source_train, batch_size)) ########## # Create a batch to feed the discriminator model ######### X_disc_real, X_disc_gen = data_utils.get_disc_batch( X_dest_batch, generator_model, batch_counter, batch_size, noise_dim, X_source_batch, noise_scale=noise_scale) # Update the discriminator if model == 'wgan': current_labels_real = -np.ones(X_disc_real.shape[0]) current_labels_gen = np.ones(X_disc_gen.shape[0]) elif model == 'lsgan': if disc_type == "simple_disc": current_labels_real = np.ones(X_disc_real.shape[0]) current_labels_gen = np.zeros(X_disc_gen.shape[0]) elif disc_type == "nclass_disc": virtual_real_labels = np.zeros( [X_disc_gen.shape[0], n_classes]) current_labels_real = [ np.ones(X_disc_real.shape[0]), virtual_real_labels ] current_labels_gen = [ np.zeros(X_disc_gen.shape[0]), Y_source_batch ] ############## #Train the disc on gen-buffered samples and on current real samples ############## disc_loss_real = discriminator_model.train_on_batch( X_disc_real, current_labels_real) img_buffer.add_to_buffer(X_disc_gen, current_labels_gen, batch_size) bufferImages, bufferLabels = img_buffer.get_from_buffer( batch_size) disc_loss_gen = discriminator_model.train_on_batch( bufferImages, bufferLabels) #if not isinstance(disc_loss_real, collections.Iterable): disc_loss_real = [disc_loss_real] #if not isinstance(disc_loss_real, collections.Iterable): disc_loss_gen = [disc_loss_gen] if disc_type == "simple_disc": list_disc_loss_real.appendleft(disc_loss_real) list_disc_loss_gen.appendleft(disc_loss_gen) elif disc_type == "nclass_disc": list_disc_loss_real.appendleft(disc_loss_real[0]) list_disc_loss_gen.appendleft(disc_loss_gen[0]) ############# ####Train the discriminator w.r.t gradient penalty ############# #gp_loss = disc_penalty_model.train_on_batch([X_disc_real,X_disc_gen],current_labels_real) #dummy labels,not used in the loss function #list_gp_loss.appendleft(gp_loss) ################ ###CLASSIFIER TRAINING OUTSIDE DISC LOOP(wanna train in just 1 time even if disc_iter > 1) ################# class_loss_gen = classificator_model.train_on_batch( X_disc_gen, Y_source_batch * 0.7) #LABEL SMOOTHING!!!! list_classifier_loss.appendleft(class_loss_gen[1]) ####################### # 2) Train the generator ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) X_source_batch2, Y_source_batch2, idx_source_batch2 = next( data_utils.gen_batch(X_source_train, Y_source_train, batch_size)) if model == 'wgan': gen_loss = DCGAN_model.train_on_batch([X_gen, X_source_batch2], -np.ones(X_gen.shape[0])) if model == 'lsgan': if disc_type == "simple_disc": gen_loss = DCGAN_model.train_on_batch( [X_gen, X_source_batch2], np.ones(X_gen.shape[0])) #TRYING SAME BATCH OF DISC elif disc_type == "nclass_disc": gen_loss = DCGAN_model.train_on_batch( [X_gen, X_source_batch2], [np.ones(X_gen.shape[0]), Y_source_batch2]) gen_loss = gen_loss[0] list_gen_loss.appendleft(gen_loss) zclass_loss = zclass_model.train_on_batch([X_gen, X_source_batch2], [X_gen]) list_zclass_loss.appendleft(zclass_loss) ############## #Train the generator w.r.t the aux classifier: ############# # GenToClassifier_model.train_on_batch([X_gen,X_source_batch2],Y_source_batch2) # I SHOULD TRY TO CLASSIFY EVEN ON DISCRIMINATOR, PUTTING ONE CLASS FOR REAL SAMPLES AND N CLASS FOR FAKE gen_iterations += 1 batch_counter += 1 progbar.add(batch_size, values=[("Loss_D_real", np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", np.mean(list_gen_loss)), ("Loss_Z", np.mean(list_zclass_loss)), ("Loss_Classifier", np.mean(list_classifier_loss))]) # plot images 1 times per epoch if batch_counter % (n_batch_per_epoch) == 0: X_source_batch_plot, Y_source_batch_plot, idx_source_plot = next( data_utils.gen_batch(X_source_test, Y_source_test, batch_size=32)) data_utils.plot_generated_batch(X_dest_test, X_source_test, generator_model, noise_dim, image_dim_ordering, idx_source_plot, batch_size=32) if gen_iterations % (n_batch_per_epoch * 5) == 0: if visualize: BIG_ASS_VISUALIZATION_slerp(X_source_train[1], generator_model, noise_dim) # if (e % 20) == 0: # lr_decay([discriminator_model,DCGAN_model,classificator_model],decay_value=0.95) print("Dest labels:") print(Y_dest_test[idx_source_plot].argmax(1)) print("Source labels:") print(Y_source_batch_plot.argmax(1)) print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) # Save model weights (by default, every 5 epochs) data_utils.save_model_weights(generator_model, discriminator_model, DCGAN_model, e, name, classificator_model, zclass_model) #testing accuracy of trained classifier loss4, acc4 = classificator_model.evaluate(Xtarget_dataset, Ytarget_dataset, batch_size=1024, verbose=0) print( '\n Classifier Accuracy and loss on full target domain: %.2f%% / %.5f%%' % ((100 * acc4), loss4))
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters patch_size = kwargs["patch_size"] image_data_format = kwargs["image_data_format"] generator_type = kwargs["generator_type"] dset = kwargs["dset"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] model_name = kwargs["model_name"] save_weights_every_n_epochs = kwargs["save_weights_every_n_epochs"] visualize_images_every_n_epochs = kwargs["visualize_images_every_n_epochs"] use_mbd = kwargs["use_mbd"] label_smoothing = kwargs["use_label_smoothing"] label_flipping_prob = kwargs["label_flipping_prob"] use_l1_weighted_loss = kwargs["use_l1_weighted_loss"] prev_model = kwargs["prev_model"] discriminator_optimizer = kwargs["discriminator_optimizer"] n_run_of_gen_for_1_run_of_disc = kwargs["n_run_of_gen_for_1_run_of_disc"] MAX_FRAMES_PER_GIF = kwargs["MAX_FRAMES_PER_GIF"] # batch_size = args.batch_size # n_batch_per_epoch = args.n_batch_per_epoch # nb_epoch = args.nb_epoch # save_weights_every_n_epochs = args.save_weights_every_n_epochs # generator_type = args.generator_type # patch_size = args.patch_size # label_smoothing = False # label_flipping_prob = False # dset = args.dset # use_mbd = False # Check and make the dataset # If .h5 file of dset is not present, try making it if not os.path.exists("../../data/processed/%s_data.h5" % dset): print("dset %s_data.h5 not present in '../../data/processed'!" % dset) if not os.path.exists("../../data/%s/" % dset): print( "dset folder %s not present in '../../data'!\n\nERROR: Dataset .h5 file not made, and dataset not available in '../../data/'.\n\nQuitting." % dset) return else: if not os.path.exists( "../../data/%s/train" % dset) or not os.path.exists( "../../data/%s/val" % dset) or not os.path.exists( "../../data/%s/test" % dset): print( "'train', 'val' or 'test' folders not present in dset folder '../../data/%s'!\n\nERROR: Dataset must contain 'train', 'val' and 'test' folders.\n\nQuitting." % dset) return else: print("Making %s dataset" % dset) subprocess.call([ 'python3', '../data/make_dataset.py', '../../data/%s' % dset, '3' ]) print("Done!") epoch_size = n_batch_per_epoch * batch_size init_epoch = 0 if prev_model: print('\n\nLoading prev_model from', prev_model, '...\n\n') prev_model_latest_gen = sorted( glob.glob(os.path.join('../../models/', prev_model, '*gen*.h5')))[-1] prev_model_latest_disc = sorted( glob.glob(os.path.join('../../models/', prev_model, '*disc*.h5')))[-1] prev_model_latest_DCGAN = sorted( glob.glob(os.path.join('../../models/', prev_model, '*DCGAN*.h5')))[-1] # Find prev model name, epoch model_name = prev_model_latest_DCGAN.split('models')[-1].split('/')[1] init_epoch = int(prev_model_latest_DCGAN.split('epoch')[1][:5]) + 1 # Setup environment (logging directory etc), if no prev_model is mentioned general_utils.setup_logging(model_name) # img_dim = X_full_train.shape[-3:] img_dim = (256, 256, 3) # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) if discriminator_optimizer == 'sgd': opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) elif discriminator_optimizer == 'adam': opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model generator_model = models.load("generator_unet_%s" % generator_type, img_dim, nb_patch, use_mbd, batch_size, model_name) generator_model.compile(loss='mae', optimizer=opt_discriminator) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, use_mbd, batch_size, model_name) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) if use_l1_weighted_loss: loss = [l1_weighted_loss, 'binary_crossentropy'] else: loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) # Load prev_model if prev_model: generator_model.load_weights(prev_model_latest_gen) discriminator_model.load_weights(prev_model_latest_disc) DCGAN_model.load_weights(prev_model_latest_DCGAN) # Load and rescale data print('\n\nLoading data...\n\n') X_full_train, X_sketch_train, X_full_val, X_sketch_val = data_utils.load_data( dset, image_data_format) check_this_process_memory() print('X_full_train: %.4f' % (X_full_train.nbytes / 2**30), "GB") print('X_sketch_train: %.4f' % (X_sketch_train.nbytes / 2**30), "GB") print('X_full_val: %.4f' % (X_full_val.nbytes / 2**30), "GB") print('X_sketch_val: %.4f' % (X_sketch_val.nbytes / 2**30), "GB") # Losses disc_losses = [] gen_total_losses = [] gen_L1_losses = [] gen_log_losses = [] # Start training print("\n\nStarting training\n\n") for e in range(nb_epoch): # Initialize progbar and batch counter # progbar = generic_utils.Progbar(epoch_size) batch_counter = 0 gen_total_loss_epoch = 0 gen_L1_loss_epoch = 0 gen_log_loss_epoch = 0 start = time.time() for X_full_batch, X_sketch_batch in data_utils.gen_batch( X_full_train, X_sketch_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch( X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping_prob=label_flipping_prob) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = next( data_utils.gen_batch(X_full_train, X_sketch_train, batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False # Train generator for _ in range(n_run_of_gen_for_1_run_of_disc - 1): gen_loss = DCGAN_model.train_on_batch( X_gen, [X_gen_target, y_gen]) gen_total_loss_epoch += gen_loss[ 0] / n_run_of_gen_for_1_run_of_disc gen_L1_loss_epoch += gen_loss[ 1] / n_run_of_gen_for_1_run_of_disc gen_log_loss_epoch += gen_loss[ 2] / n_run_of_gen_for_1_run_of_disc X_gen_target, X_gen = next( data_utils.gen_batch(X_full_train, X_sketch_train, batch_size)) gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Add losses gen_total_loss_epoch += gen_loss[ 0] / n_run_of_gen_for_1_run_of_disc gen_L1_loss_epoch += gen_loss[ 1] / n_run_of_gen_for_1_run_of_disc gen_log_loss_epoch += gen_loss[ 2] / n_run_of_gen_for_1_run_of_disc # Unfreeze the discriminator discriminator_model.trainable = True # Progress # progbar.add(batch_size, values=[("D logloss", disc_loss), # ("G tot", gen_loss[0]), # ("G L1", gen_loss[1]), # ("G logloss", gen_loss[2])]) print("Epoch", str(init_epoch + e + 1), "batch", str(batch_counter + 1), "D_logloss", disc_loss, "G_tot", gen_loss[0], "G_L1", gen_loss[1], "G_log", gen_loss[2]) batch_counter += 1 if batch_counter >= n_batch_per_epoch: break gen_total_loss = gen_total_loss_epoch / n_batch_per_epoch gen_L1_loss = gen_L1_loss_epoch / n_batch_per_epoch gen_log_loss = gen_log_loss_epoch / n_batch_per_epoch disc_losses.append(disc_loss) gen_total_losses.append(gen_total_loss) gen_L1_losses.append(gen_L1_loss) gen_log_losses.append(gen_log_loss) check_this_process_memory() print('Epoch %s/%s, Time: %.4f' % (init_epoch + e + 1, init_epoch + nb_epoch, time.time() - start)) # Save images for visualization if (e + 1) % visualize_images_every_n_epochs == 0: data_utils.plot_generated_batch(X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, model_name, "training", init_epoch + e + 1, MAX_FRAMES_PER_GIF) # Get new images from validation X_full_batch, X_sketch_batch = next( data_utils.gen_batch(X_full_val, X_sketch_val, batch_size)) data_utils.plot_generated_batch(X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, model_name, "validation", init_epoch + e + 1, MAX_FRAMES_PER_GIF) # Plot losses data_utils.plot_losses(disc_losses, gen_total_losses, gen_L1_losses, gen_log_losses, model_name, init_epoch) # Save weights if (e + 1) % save_weights_every_n_epochs == 0: gen_weights_path = os.path.join( '../../models/%s/gen_weights_epoch%05d_discLoss%.04f_genTotL%.04f_genL1L%.04f_genLogL%.04f.h5' % (model_name, init_epoch + e, disc_losses[-1], gen_total_losses[-1], gen_L1_losses[-1], gen_log_losses[-1])) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join( '../../models/%s/disc_weights_epoch%05d_discLoss%.04f_genTotL%.04f_genL1L%.04f_genLogL%.04f.h5' % (model_name, init_epoch + e, disc_losses[-1], gen_total_losses[-1], gen_L1_losses[-1], gen_log_losses[-1])) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join( '../../models/%s/DCGAN_weights_epoch%05d_discLoss%.04f_genTotL%.04f_genL1L%.04f_genLogL%.04f.h5' % (model_name, init_epoch + e, disc_losses[-1], gen_total_losses[-1], gen_L1_losses[-1], gen_log_losses[-1])) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) except KeyboardInterrupt: pass
def trainClassAux(**kwargs): """ Train standard DCGAN model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters generator = kwargs["generator"] discriminator = kwargs["discriminator"] dset = kwargs["dset"] img_dim = kwargs["img_dim"] nb_epoch = kwargs["nb_epoch"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] bn_mode = kwargs["bn_mode"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] image_dim_ordering = kwargs["image_dim_ordering"] epoch_size = n_batch_per_epoch * batch_size deterministic = kwargs["deterministic"] inject_noise = kwargs["inject_noise"] model = kwargs["model"] no_supertrain = kwargs["no_supertrain"] noClass = kwargs["noClass"] resume = kwargs["resume"] name = kwargs["name"] wd = kwargs["wd"] C_weight = kwargs["C_weight"] monsterClass = kwargs["monsterClass"] pretrained = kwargs["pretrained"] print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("DCGAN") # Load and normalize data if dset == "mnistM": X_source_train,Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='mnist') X_dest_train,Y_dest_train, X_dest_test, Y_dest_test,n_classes2 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='mnistM') elif dset == "washington_vandal50k": X_source_train = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='washington') X_dest_train = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='vandal50k') elif dset == "washington_vandal12classes": X_source_train = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='washington12classes') X_dest_train = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='vandal12classes') elif dset == "washington_vandal12classesNoBackground": X_source_train,Y_source_train,n_classes1 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='washington12classes') X_dest_train,Y_dest_train,n_classes2 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='vandal12classesNoBackground') elif dset == "Wash_Vand_12class_LMDB": X_source_train,Y_source_train,n_classes1 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='Wash_12class_LMDB') X_dest_train,Y_dest_train,n_classes2 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='Vand_12class_LMDB') elif dset == "Vand_Vand_12class_LMDB": X_source_train,Y_source_train,X_source_test, Y_source_test,n_classes1 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='Vand_12class_LMDB_Background') X_dest_train,Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='Vand_12class_LMDB') elif dset == "Wash_Color_LMDB": X_source_train,Y_source_train,X_source_test, Y_source_test,n_classes1 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='Wash_Color_LMDB') X_dest_train,Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset(img_dim, image_dim_ordering,dset='Wash_Color_LMDB') else: print "dataset not supported" if n_classes1 != n_classes2: #sanity check print "number of classes mismatch between source and dest domains" n_classes = n_classes1 # img_source_dim = X_source_train.shape[-3:] # is it backend agnostic? img_dest_dim = X_dest_train.shape[-3:] X_source_train.flags.writeable = False X_source_test.flags.writeable = False X_dest_train.flags.writeable = False X_dest_test.flags.writeable = False # Create optimizers opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_G_C = data_utils.get_optimizer(opt_G, lr_G*C_weight) opt_D = data_utils.get_optimizer(opt_D, lr_D) opt_C = data_utils.get_optimizer('SGD', 0.01) ####################### # Load models ####################### noise_dim = (noise_dim,) if generator == "upsampling": generator_model = models.generator_upsampling_mnistM(noise_dim, img_source_dim,img_dest_dim, bn_mode,deterministic,inject_noise,wd, dset=dset) else: generator_model = models.generator_deconv(noise_dim, img_dest_dim, bn_mode, batch_size, dset=dset) discriminator_model = models.discriminator(img_dest_dim, bn_mode,model,wd,monsterClass,inject_noise,n_classes) DCGAN_model = models.DCGAN_naive(generator_model, discriminator_model, noise_dim, img_source_dim) classifier = models.resnet(img_dest_dim,n_classes,pretrained,wd=0.0001) #it is img_dest_dim because it is actually the generated image dim,that is equal to dest_dim GenToClassifierModel = models.GenToClassifierModel(generator_model, classifier, noise_dim, img_source_dim) ############################ # Load weights ############################ if resume: data_utils.load_model_weights(generator_model, discriminator_model, DCGAN_model, name) #if pretrained: # model_path = "../../models/DCGAN" # class_weights_path = os.path.join(model_path, 'NoBackground_100epochs.h5') # classifier.load_weights(class_weights_path) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) if model == 'wgan': discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) models.make_trainable(discriminator_model, False) DCGAN_model.compile(loss=models.wasserstein, optimizer=opt_G) if model == 'lsgan': discriminator_model.compile(loss='mse', optimizer=opt_D) models.make_trainable(discriminator_model, False) DCGAN_model.compile(loss='mse', optimizer=opt_G) classifier.compile(loss='categorical_crossentropy', optimizer=opt_C,metrics=['accuracy']) # it is actually never using optimizer models.make_trainable(classifier, False) GenToClassifierModel.compile(loss='categorical_crossentropy', optimizer=opt_G,metrics=['accuracy']) ####################### # Train classifier ####################### # if not pretrained: # #print ("Testing accuracy on target domain test set before training:") # loss1,acc1 =classifier.evaluate(X_dest_test, Y_dest_test,batch_size=256, verbose=0) # print('\n Classifier Accuracy on target domain test set before training: %.2f%%' % (100 * acc1)) # classifier.fit(X_dest_train, Y_dest_train, validation_split=0.1, batch_size=512, nb_epoch=10, verbose=1) # print ("\n Testing accuracy on target domain test set AFTER training:") # else: # print ("Loaded pretrained classifier, computing accuracy on target domain test set:") # loss2,acc2 = classifier.evaluate(X_dest_test, Y_dest_test,batch_size=512, verbose=0) # print('\n Classifier Accuracy on target domain test set after training: %.2f%%' % (100 * acc2)) #print ("Testing accuracy on source domain test set:") # loss3, acc3 = classifier.evaluate(X_source_test, Y_source_test,batch_size=512, verbose=0) # print('\n Classifier Accuracy on source domain test set: %.2f%%' % (100 * acc3)) # evaluating_GENned(noise_scale, noise_dim, X_source_test, Y_source_test, classifier, generator_model) # model_path = "../../models/DCGAN" # class_weights_path = os.path.join(model_path, 'VandToVand_5epochs.h5') # classifier.save_weights(class_weights_path, overwrite=True) ################# # GAN training ################ gen_iterations = 0 for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: if no_supertrain is None: if (gen_iterations < 25) and (not resume): disc_iterations = 100 if gen_iterations % 500 == 0: disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] else: if (gen_iterations <25) and (not resume): disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] list_gen_loss = [] list_class_loss_real = [] for disc_it in range(disc_iterations): # Clip discriminator weights # for l in discriminator_model.layers: # weights = l.get_weights() # weights = [np.clip(w, clamp_lower, clamp_upper) for w in weights] # l.set_weights(weights) X_dest_batch, Y_dest_batch,idx_dest_batch = next(data_utils.gen_batch(X_dest_train, Y_dest_train, batch_size)) X_source_batch, Y_source_batch,idx_source_batch = next(data_utils.gen_batch(X_source_train, Y_source_train, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch(X_dest_batch, generator_model, batch_counter, batch_size, noise_dim, X_source_batch, noise_scale=noise_scale) if model == 'wgan': # Update the discriminator disc_loss_real = discriminator_model.train_on_batch(X_disc_real, -np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch(X_disc_gen, np.ones(X_disc_gen.shape[0])) if model == 'lsgan': disc_loss_real = discriminator_model.train_on_batch(X_disc_real, np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch(X_disc_gen, np.zeros(X_disc_gen.shape[0])) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator with GAN loss ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) source_images = X_source_train[np.random.randint(0,X_source_train.shape[0],size=batch_size),:,:,:] X_source_batch2, Y_source_batch2,idx_source_batch2 = next(data_utils.gen_batch(X_source_train, Y_source_train, batch_size)) # Freeze the discriminator # discriminator_model.trainable = False if model == 'wgan': gen_loss = DCGAN_model.train_on_batch([X_gen,X_source_batch2], -np.ones(X_gen.shape[0])) if model == 'lsgan': gen_loss = DCGAN_model.train_on_batch([X_gen,X_source_batch2], np.ones(X_gen.shape[0])) list_gen_loss.append(gen_loss) ####################### # 3) Train the generator with Classifier loss ####################### w1 = classifier.get_weights() #FOR DEBUG if not noClass: new_gen_loss = GenToClassifierModel.train_on_batch([X_gen,X_source_batch2], Y_source_batch2) list_class_loss_real.append(new_gen_loss) else: list_class_loss_real.append(0.0) w2 = classifier.get_weights() #FOR DEBUG for a,b in zip(w1, w2): if np.all(a == b): print "no bug in GEN model update" else: print "BUG IN GEN MODEL UPDATE" gen_iterations += 1 batch_counter += 1 progbar.add(batch_size, values=[("Loss_D", 0.5*np.mean(list_disc_loss_real) + 0.5*np.mean(list_disc_loss_gen)), ("Loss_D_real", np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", np.mean(list_gen_loss)), ("Loss_classifier", np.mean(list_class_loss_real))]) # plot images 1 times per epoch if batch_counter % (n_batch_per_epoch) == 0: # train_WGAN.plot_images(X_dest_batch) X_dest_batch_plot,Y_dest_batch_plot,idx_dest_plot = next(data_utils.gen_batch(X_dest_train,Y_dest_train, batch_size=32)) X_source_batch_plot,Y_source_batch_plot,idx_source_plot = next(data_utils.gen_batch(X_source_train,Y_source_train, batch_size=32)) data_utils.plot_generated_batch(X_dest_train,X_source_train, generator_model, noise_dim, image_dim_ordering,idx_source_plot,batch_size=32) print ("Dest labels:") print (Y_dest_train[idx_source_plot].argmax(1)) print ("Source labels:") print (Y_source_batch_plot.argmax(1)) print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) # Save model weights (by default, every 5 epochs) data_utils.save_model_weights(generator_model, discriminator_model, DCGAN_model, e, name) evaluating_GENned(noise_scale,noise_dim,X_source_test,Y_source_test,classifier,generator_model) loss3, acc3 = classifier.evaluate(X_source_test, Y_source_test,batch_size=512, verbose=0) print('\n Classifier Accuracy on source domain test set: %.2f%%' % (100 * acc3))
print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_full_batch, X_sketch_batch in gen_batch(X_full_train, X_sketch_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = get_disc_batch(X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = next( gen_batch(X_full_train, X_sketch_train, batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] generator = kwargs["generator"] model_name = kwargs["model_name"] image_data_format = kwargs["image_data_format"] celebA_img_dim = kwargs["celebA_img_dim"] cont_dim = (kwargs["cont_dim"], ) cat_dim = (kwargs["cat_dim"], ) noise_dim = (kwargs["noise_dim"], ) label_smoothing = kwargs["label_smoothing"] label_flipping = kwargs["label_flipping"] noise_scale = kwargs["noise_scale"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] load_from_dir = kwargs["load_from_dir"] target_size = kwargs["target_size"] save_weights_every_n_epochs = kwargs["save_weights_every_n_epochs"] save_only_last_n_weights = kwargs["save_only_last_n_weights"] visualize_images_every_n_epochs = kwargs["visualize_images_every_n_epochs"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) general_utils.setup_logging(**kwargs) # Load and rescale data if dset == "celebA": X_real_train = data_utils.load_celebA(celebA_img_dim, image_data_format) elif dset == "mnist": X_real_train, _, _, _ = data_utils.load_mnist(image_data_format) else: X_batch_gen = data_utils.data_generator_from_dir( dset, target_size, batch_size) X_real_train = next(X_batch_gen) img_dim = X_real_train.shape[-3:] try: # Create optimizers opt_dcgan = Adam(lr=1E-4, beta_1=0.5, beta_2=0.999, epsilon=1e-08) opt_discriminator = Adam(lr=1E-4, beta_1=0.5, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-4, momentum=0.9, nesterov=True) # Load generator model generator_model = models.load("generator_%s" % generator, cat_dim, cont_dim, noise_dim, img_dim, batch_size, dset=dset, use_mbd=use_mbd) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", cat_dim, cont_dim, noise_dim, img_dim, batch_size, dset=dset, use_mbd=use_mbd) generator_model.compile(loss='mse', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, cat_dim, cont_dim, noise_dim) list_losses = [ 'binary_crossentropy', 'categorical_crossentropy', gaussian_loss ] list_weights = [1, 1, 1] DCGAN_model.compile(loss=list_losses, loss_weights=list_weights, optimizer=opt_dcgan) # Multiple discriminator losses discriminator_model.trainable = True discriminator_model.compile(loss=list_losses, loss_weights=list_weights, optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 if not load_from_dir: X_batch_gen = data_utils.gen_batch(X_real_train, batch_size) # Start training print("Start training") disc_total_losses = [] disc_log_losses = [] disc_cat_losses = [] disc_cont_losses = [] gen_total_losses = [] gen_log_losses = [] gen_cat_losses = [] gen_cont_losses = [] start = time.time() for e in range(nb_epoch): print('--------------------------------------------') print('[{0:%Y/%m/%d %H:%M:%S}] Epoch {1:d}/{2:d}\n'.format( datetime.datetime.now(), e + 1, nb_epoch)) # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 disc_total_loss_batch = 0 disc_log_loss_batch = 0 disc_cat_loss_batch = 0 disc_cont_loss_batch = 0 gen_total_loss_batch = 0 gen_log_loss_batch = 0 gen_cat_loss_batch = 0 gen_cont_loss_batch = 0 for batch_counter in range(n_batch_per_epoch): # Load data X_real_batch = next(X_batch_gen) # Create a batch to feed the discriminator model X_disc, y_disc, y_cat, y_cont = data_utils.get_disc_batch( X_real_batch, generator_model, batch_counter, batch_size, cat_dim, cont_dim, noise_dim, noise_scale=noise_scale, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch( X_disc, [y_disc, y_cat, y_cont]) # Create a batch to feed the generator model X_gen, y_gen, y_cat, y_cont, y_cont_target = data_utils.get_gen_batch( batch_size, cat_dim, cont_dim, noise_dim, noise_scale=noise_scale) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch( [y_cat, y_cont, X_gen], [y_gen, y_cat, y_cont_target]) # Unfreeze the discriminator discriminator_model.trainable = True progbar.add(batch_size, values=[("D tot", disc_loss[0]), ("D log", disc_loss[1]), ("D cat", disc_loss[2]), ("D cont", disc_loss[3]), ("G tot", gen_loss[0]), ("G log", gen_loss[1]), ("G cat", gen_loss[2]), ("G cont", gen_loss[3])]) disc_total_loss_batch += disc_loss[0] disc_log_loss_batch += disc_loss[1] disc_cat_loss_batch += disc_loss[2] disc_cont_loss_batch += disc_loss[3] gen_total_loss_batch += gen_loss[0] gen_log_loss_batch += gen_loss[1] gen_cat_loss_batch += gen_loss[2] gen_cont_loss_batch += gen_loss[3] # # Save images for visualization # if batch_counter % (n_batch_per_epoch / 2) == 0: # data_utils.plot_generated_batch(X_real_batch, generator_model, e, # batch_size, cat_dim, cont_dim, noise_dim, # image_data_format, model_name) disc_total_losses.append(disc_total_loss_batch / n_batch_per_epoch) disc_log_losses.append(disc_log_loss_batch / n_batch_per_epoch) disc_cat_losses.append(disc_cat_loss_batch / n_batch_per_epoch) disc_cont_losses.append(disc_cont_loss_batch / n_batch_per_epoch) gen_total_losses.append(gen_total_loss_batch / n_batch_per_epoch) gen_log_losses.append(gen_log_loss_batch / n_batch_per_epoch) gen_cat_losses.append(gen_cat_loss_batch / n_batch_per_epoch) gen_cont_losses.append(gen_cont_loss_batch / n_batch_per_epoch) # Save images for visualization if (e + 1) % visualize_images_every_n_epochs == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, e, batch_size, cat_dim, cont_dim, noise_dim, image_data_format, model_name) data_utils.plot_losses(disc_total_losses, disc_log_losses, disc_cat_losses, disc_cont_losses, gen_total_losses, gen_log_losses, gen_cat_losses, gen_cont_losses, model_name) if (e + 1) % save_weights_every_n_epochs == 0: print("Saving weights...") # Delete all but the last n weights general_utils.purge_weights(save_only_last_n_weights, model_name) # Save weights gen_weights_path = os.path.join( '../../models/%s/gen_weights_epoch%05d.h5' % (model_name, e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join( '../../models/%s/disc_weights_epoch%05d.h5' % (model_name, e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join( '../../models/%s/DCGAN_weights_epoch%05d.h5' % (model_name, e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) end = time.time() print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, end - start)) start = end except KeyboardInterrupt: pass gen_weights_path = '../../models/%s/generator_latest.h5' % (model_name) print("Saving", gen_weights_path) generator_model.save(gen_weights_path, overwrite=True)
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] generator = kwargs["generator"] model_name = kwargs["model_name"] image_dim_ordering = kwargs["image_dim_ordering"] img_dim = kwargs["img_dim"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["label_smoothing"] label_flipping = kwargs["label_flipping"] noise_scale = kwargs["noise_scale"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) general_utils.setup_logging(model_name) # Load and rescale data if dset == "celebA": X_real_train = data_utils.load_celebA(img_dim, image_dim_ordering) if dset == "mnist": X_real_train, _, _, _ = data_utils.load_mnist(image_dim_ordering) img_dim = X_real_train.shape[-3:] noise_dim = (100,) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.5, beta_2=0.999, epsilon=1e-08) opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) # Load generator model generator_model = models.load("generator_%s" % generator, noise_dim, img_dim, bn_mode, batch_size, dset=dset, use_mbd=use_mbd) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", noise_dim, img_dim, bn_mode, batch_size, dset=dset, use_mbd=use_mbd) generator_model.compile(loss='mse', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_dim) loss = ['binary_crossentropy'] loss_weights = [1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_real_batch in data_utils.gen_batch(X_real_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch(X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen, y_gen = data_utils.get_gen_batch(batch_size, noise_dim, noise_scale=noise_scale) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, y_gen) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G logloss", gen_loss)]) # Save images for visualization if batch_counter % 100 == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, batch_size, noise_dim, image_dim_ordering) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) if e % 5 == 0: gen_weights_path = os.path.join('../../models/%s/gen_weights_epoch%s.h5' % (model_name, e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join('../../models/%s/disc_weights_epoch%s.h5' % (model_name, e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join('../../models/%s/DCGAN_weights_epoch%s.h5' % (model_name, e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) except KeyboardInterrupt: pass
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] model_name = kwargs["model_name"] generator = kwargs["generator"] image_data_format = kwargs["image_data_format"] img_dim = kwargs["img_dim"] patch_size = kwargs["patch_size"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["use_label_smoothing"] label_flipping = kwargs["label_flipping"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] # right strip '/' to avoid empty '/' dir save_dir = kwargs["save_dir"].rstrip('/') # join name with current datetime save_dir = '_'.join( [save_dir, datetime.datetime.now().strftime("%I:%M%p-%B%d-%Y/")]) if not os.path.isdir(save_dir): os.makedirs(save_dir) # save the config in save dir with open('{0}job_config.json'.format(save_dir), 'w') as fp: json.dump(kwargs, fp, sort_keys=True, indent=4) epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) general_utils.setup_logging(model_name) # Load and rescale data X_full_train, X_sketch_train, X_full_val, X_sketch_val = data_utils.load_data( dset, image_data_format) img_dim = X_full_train.shape[-3:] # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model generator_model = models.load("generator_unet_%s" % generator, img_dim, nb_patch, bn_mode, use_mbd, batch_size) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, bn_mode, use_mbd, batch_size) generator_model.compile(loss='mae', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_full_batch, X_sketch_batch in data_utils.gen_batch( X_full_train, X_sketch_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch( X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = next( data_utils.gen_batch(X_full_train, X_sketch_train, batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G tot", gen_loss[0]), ("G L1", gen_loss[1]), ("G logloss", gen_loss[2])]) # Save images for visualization if batch_counter % (n_batch_per_epoch / 2) == 0: # Get new images from validation data_utils.plot_generated_batch( X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, "{:03}_EPOCH_TRAIN".format(e + 1), save_dir) X_full_batch, X_sketch_batch = next( data_utils.gen_batch(X_full_val, X_sketch_val, batch_size)) data_utils.plot_generated_batch( X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, "{:03}_EPOCH_VALID".format(e + 1), save_dir) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) if e % 5 == 0: pass # save models # gen_weights_path = os.path.join('../../models/%s/gen_weights_epoch%s.h5' % (model_name, e)) # generator_model.save_weights(gen_weights_path, overwrite=True) # disc_weights_path = os.path.join('../../models/%s/disc_weights_epoch%s.h5' % (model_name, e)) # discriminator_model.save_weights(disc_weights_path, overwrite=True) # DCGAN_weights_path = os.path.join('../../models/%s/DCGAN_weights_epoch%s.h5' % (model_name, e)) # DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) except KeyboardInterrupt: pass # save models DCGAN_model.save(save_dir + 'DCGAN.h5') generator_model.save(save_dir + 'GENERATOR.h5') discriminator_model.save(save_dir + 'DISCRIMINATOR.h5')
def train(self, num_epoch, data_path): # dataset_name, data_path = './datasets'): ''' Train CGAN :param num_epoch: number of epoches specified by user ''' def perceptual_loss(img_true, img_generated): image_shape = self.img_dim vgg = VGG16(include_top=False, weights='imagenet', input_shape=image_shape) loss_block3 = Model(inputs=vgg.input, outputs=vgg.get_layer('block3_conv3').output) loss_block3.trainable = False loss_block2 = Model(inputs=vgg.input, outputs=vgg.get_layer('block2_conv2').output) loss_block2.trainable = False loss_block1 = Model(input=vgg.input, outputs=vgg.get_layer('block1_conv2').output) loss_block1.trainable = False return K.mean( K.square(loss_block1(img_true) - loss_block1(img_generated)) ) + 2 * K.mean( K.square(loss_block2(img_true) - loss_block2(img_generated)) ) + 5 * K.mean( K.square(loss_block3(img_true) - loss_block3(img_generated))) # Load data self.load_data(path=data_path) if self._data_format == "channels_first": patch_size = self.patch_dim[1:] else: patch_size = self.patch_dim[:2] self.discriminator.trainable = False self.generator.compile(loss=perceptual_loss, optimizer=self.optimizer_cgan) #, #callbacks = [generator_tensorboard]) # ------------- # Compile CGAN # ------------- CGAN_loss = ['mae', perceptual_loss, 'binary_crossentropy'] CGAN_loss_weights = [2E-1, 2E-3, 1] # implement like equation 4 (lamda = 10) self.logger_model.info( 'Weights between L1 loss, perceptual loss and GAN loss is {}'. format(CGAN_loss_weights)) self.CGAN_model.compile( loss=CGAN_loss, loss_weights=CGAN_loss_weights, optimizer=self.optimizer_cgan) # ,callbacks = [CGAN_tensorboard]) self.discriminator.trainable = True #enable trainable for discriminator self.discriminator.compile(loss="binary_crossentropy", optimizer=self.optimizer_discriminator) #, #callbacks = [discriminator_tensorboard]) # Prepare to write log file self.logger_traininfo.info( 'Image size: {0} '. format(self.img_dim)) self.logger_traininfo.info( 'Patch size: {0} '. format(self.patch_dim)) self.logger_traininfo.info( 'Number of patches for image: {0} '. format(self.num_patch)) self.logger_traininfo.info( 'Data format: {0} '. format(self._data_format)) self.logger_model.info('Generator summary:') self.generator.summary(print_fn=self.logger_model.info) self.logger_model.info('Discriminator summary:') self.discriminator.summary(print_fn=self.logger_model.info) self.logger_model.info('CGAN summary:') self.CGAN_model.summary(print_fn=self.logger_model.info) # Save model structure # Write json and hdf5 to save model model_json = self.discriminator.to_json() with open(self.model_save_path + '/' + "discriminator.json", "w") as json_file: json_file.write(model_json) model_json = self.generator.to_json() with open(self.model_save_path + '/' + "generator.json", "w") as json_file: json_file.write(model_json) model_json = self.CGAN_model.to_json() with open(self.model_save_path + '/' + "CGAN.json", "w") as json_file: json_file.write(model_json) self.logger_traininfo.info('Training start at {}.......'.format( datetime.datetime.now())) training_history = { 'Epoch': [], 'Batch': [], 'D_logloss_train_real': [], 'D_logloss_train_fake': [], 'G_tot_loss_train': [], 'G_l1loss_train': [], 'G_ploss_train': [], 'G_ganloss_train': [], 'D_logloss_val_real': [], 'D_logloss_val_fake': [], 'G_tot_loss_val': [], 'G_l1loss_val': [], 'G_ploss_val': [], 'G_ganloss_val': [] } for epoch_iterator in range(num_epoch): epoch_training_start_time = time.time() # For each batch iteration, one epoch iterate all the data once unfortunately # data_loader load each batch in (imgs_A, imgs_B) for batch_i, (imgs_A, imgs_B) in enumerate( self.train_data_loader.load_batch(self.batch_size)): training_history['Epoch'].append(epoch_iterator) training_history['Batch'].append(batch_i) self.logger_traininfo.info( '{} Epoch {} Batch {}'. format(datetime.datetime.now(), training_history['Epoch'][-1], training_history['Batch'][-1])) # ------------------- # Train discriminator # ------------------- imgs_A_fake = self.generator.predict(imgs_B) generated_patchs_real, generated_labels_real = data_utils.get_disc_batch( imgs_A, "real", patch_size, self._data_format, self.patch_overlapping_rate) generated_patchs_fake, generated_labels_fake = data_utils.get_disc_batch( imgs_A_fake, "fake", patch_size, self._data_format, self.patch_overlapping_rate) # Update discriminator if batch_i % 3 == 2: self.discriminator.trainable = True discriminator_loss_real = self.discriminator.train_on_batch( generated_patchs_real, generated_labels_real ) # return binary_crossentropy loss for real img discriminator_loss_fake = self.discriminator.train_on_batch( generated_patchs_fake, generated_labels_fake ) # return binary_crossentropy loss for fake img training_history['D_logloss_train_real'].append( discriminator_loss_real) training_history['D_logloss_train_fake'].append( discriminator_loss_fake) self.logger_traininfo.info( 'Discriminator logloss of real image on training {}' .format(training_history['D_logloss_train_real'][-1])) self.logger_traininfo.info( 'Discriminator logloss of fake image on training {}' .format(training_history['D_logloss_train_fake'][-1])) else: training_history['D_logloss_train_real'].append(None) training_history['D_logloss_train_fake'].append(None) self.CGAN_model.trainable = True self.discriminator.trainable = False # --------------- # Train generator # --------------- # Train generator only with real image labels = np.zeros((imgs_A.shape[0], 2), dtype=np.uint8) # one-hot encoding labels[:, 1] = 1 genarator_loss = self.CGAN_model.train_on_batch( imgs_B, [imgs_A, imgs_A, labels]) training_history['G_tot_loss_train'].append(genarator_loss[0]) training_history['G_l1loss_train'].append(genarator_loss[1]) training_history['G_ploss_train'].append(genarator_loss[2]) training_history['G_ganloss_train'].append(genarator_loss[3]) self.logger_traininfo.info( 'Generator total loss on training {}'. format(training_history['G_tot_loss_train'][-1])) self.logger_traininfo.info( 'Generator L1 loss on training {}'. format(training_history['G_l1loss_train'][-1])) self.logger_traininfo.info( 'Generator peceptual loss on training {}'. format(training_history['G_ploss_train'][-1])) self.logger_traininfo.info( 'Generator log GAN loss on training {}'. format(training_history['G_ganloss_train'][-1])) # After training 30 batch, test performance on validation data if batch_i % 30 == 29: imgs_A_real_val, imgs_B_val = self.val_data_loader.load_data( ) # load whole data # Get all patches imgs_A_fake_val = self.generator.predict(imgs_B_val) generated_patchs_real_val, generated_labels_real_val = data_utils.get_disc_batch( imgs_A_real_val, "real", patch_size, self._data_format, self.patch_overlapping_rate) generated_patchs_fake_val, generated_labels_fake_val = data_utils.get_disc_batch( imgs_A_fake_val, "fake", patch_size, self._data_format, self.patch_overlapping_rate) discriminator_loss_real_val = self.discriminator.evaluate( generated_patchs_real_val, generated_labels_real_val) discriminator_loss_fake_val = self.discriminator.evaluate( generated_patchs_fake_val, generated_labels_fake_val) training_history['D_logloss_val_real'].append( discriminator_loss_real_val) training_history['D_logloss_val_fake'].append( discriminator_loss_fake_val) self.logger_traininfo.info( 'Discriminator logloss of real image on validation {}' .format(training_history['D_logloss_val_real'][-1])) self.logger_traininfo.info( 'Discriminator logloss of fake image on validation {}' .format(training_history['D_logloss_val_fake'][-1])) labels_val = np.zeros((imgs_A_real_val.shape[0], 2), dtype=np.uint8) # one-hot encoding labels_val[:, 1] = 1 generator_loss_validation = self.CGAN_model.evaluate( imgs_B_val, [imgs_A_real_val, imgs_A_real_val, labels_val]) training_history['G_tot_loss_val'].append( generator_loss_validation[0]) training_history['G_l1loss_val'].append( generator_loss_validation[0]) training_history['G_ploss_val'].append( generator_loss_validation[1]) training_history['G_ganloss_val'].append( generator_loss_validation[2]) self.logger_traininfo.info( 'Generator total loss on validation {}' .format(training_history['G_tot_loss_val'][-1])) self.logger_traininfo.info( 'Generator L1 loss on validation {}' .format(training_history['G_l1loss_val'][-1])) self.logger_traininfo.info( 'Generator peceptual loss on validation {}' .format(training_history['G_ploss_val'][-1])) self.logger_traininfo.info( 'Generator log GAN loss on validation {}' .format(training_history['G_ganloss_val'][-1])) else: training_history['D_logloss_val_real'].append(None) training_history['D_logloss_val_fake'].append(None) training_history['G_tot_loss_val'].append(None) training_history['G_l1loss_val'].append(None) training_history['G_ploss_val'].append(None) training_history['G_ganloss_val'].append(None) time_elapse = time.time() - epoch_training_start_time # Unit [s] self.logger_traininfo.info('Epoch {0} costs {1}s'.format( epoch_iterator, time_elapse)) #print('Epoch {0} completes! It costs {1}s\n'.format(epoch_iterator,time_elapse), file = file_obj) # Save generated samples for visualization every epoch imgs_A_real_train, imgs_B_train = self.train_data_loader.load_data( ) imgs_A_real_val, imgs_B_val = self.val_data_loader.load_data() imgs_A_fake_train = self.generator.predict(imgs_B_train) imgs_A_fake_val = self.generator.predict(imgs_B_val) data_utils.plot_generated_batch(imgs_A_real_train, imgs_B_train, imgs_A_fake_train, self.batch_size, self._data_format, 'training', epoch_iterator, self.figure_path) data_utils.plot_generated_batch(imgs_A_real_val, imgs_B_val, imgs_A_fake_val, self.batch_size, self._data_format, 'validation', epoch_iterator, self.figure_path) # Save training history in csv df = pd.DataFrame(training_history, columns=[ 'Epoch', 'Batch', 'D_logloss_train_real', 'D_logloss_train_fake', 'G_tot_loss_train', 'G_l1loss_train', 'G_ploss_train', 'G_ganloss_train', 'D_logloss_val_real', 'D_logloss_val_fake', 'G_tot_loss_val', 'G_l1loss_val', 'G_ploss_val', 'G_ganloss_val' ]) df.to_csv(self.log_path + '/training_history.csv') # Save weights of models if epoch_iterator % 10 == 9: self.generator.save_weights(self.model_save_path + '/' + 'generator.hdf5', overwrite=True) self.discriminator.save_weights(self.model_save_path + '/' + 'discriminator.hdf5', overwrite=True) self.CGAN_model.save_weights(self.model_save_path + '/' + 'CGAN.hdf5', overwrite=True)
def main(dataset, batch_size, patch_size, epochs, label_smoothing, label_flipping): print(project_dir) config = tf.ConfigProto() config.gpu_options.allow_growth = True # dynamically grow the memory used on the GPU sess = tf.Session(config=config) K.tensorflow_backend.set_session( sess) # set this TensorFlow session as the default session for Keras image_data_format = "channels_first" K.set_image_data_format(image_data_format) save_images_every_n_batches = 30 save_model_every_n_epochs = 0 # configuration parameters print("Config params:") print(" dataset = {}".format(dataset)) print(" batch_size = {}".format(batch_size)) print(" patch_size = {}".format(patch_size)) print(" epochs = {}".format(epochs)) print(" label_smoothing = {}".format(label_smoothing)) print(" label_flipping = {}".format(label_flipping)) print(" save_images_every_n_batches = {}".format( save_images_every_n_batches)) print(" save_model_every_n_epochs = {}".format(save_model_every_n_epochs)) model_name = datetime.strftime(datetime.now(), '%y%m%d-%H%M') model_dir = os.path.join(project_dir, "models", model_name) fig_dir = os.path.join(project_dir, "reports", "figures") logs_dir = os.path.join(project_dir, "reports", "logs", model_name) os.makedirs(model_dir) # Load and rescale data ds_train_gen = data_utils.DataGenerator(file_path=dataset, dataset_type="train", batch_size=batch_size) ds_train_disc = data_utils.DataGenerator(file_path=dataset, dataset_type="train", batch_size=batch_size) ds_val = data_utils.DataGenerator(file_path=dataset, dataset_type="val", batch_size=batch_size) enq_train_gen = OrderedEnqueuer(ds_train_gen, use_multiprocessing=True, shuffle=True) enq_train_disc = OrderedEnqueuer(ds_train_disc, use_multiprocessing=True, shuffle=True) enq_val = OrderedEnqueuer(ds_val, use_multiprocessing=True, shuffle=False) img_dim = ds_train_gen[0][0].shape[-3:] n_batch_per_epoch = len(ds_train_gen) epoch_size = n_batch_per_epoch * batch_size print("Derived params:") print(" n_batch_per_epoch = {}".format(n_batch_per_epoch)) print(" epoch_size = {}".format(epoch_size)) print(" n_batches_val = {}".format(len(ds_val))) # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size) tensorboard = TensorBoard(log_dir=logs_dir, histogram_freq=0, batch_size=batch_size, write_graph=True, write_grads=True, update_freq='batch') try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model generator_model = models.generator_unet_upsampling(img_dim) generator_model.summary() plot_model(generator_model, to_file=os.path.join(fig_dir, "generator_model.png"), show_shapes=True, show_layer_names=True) # Load discriminator model # TODO: modify disc to accept real input as well discriminator_model = models.DCGAN_discriminator( img_dim_disc, nb_patch) discriminator_model.summary() plot_model(discriminator_model, to_file=os.path.join(fig_dir, "discriminator_model.png"), show_shapes=True, show_layer_names=True) # TODO: pretty sure this is unnecessary generator_model.compile(loss='mae', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) # L1 loss applies to generated image, cross entropy applies to predicted label loss = [models.l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) tensorboard.set_model(DCGAN_model) # Start training enq_train_gen.start(workers=1, max_queue_size=20) enq_train_disc.start(workers=1, max_queue_size=20) enq_val.start(workers=1, max_queue_size=20) out_train_gen = enq_train_gen.get() out_train_disc = enq_train_disc.get() out_val = enq_val.get() print("Start training") for e in range(1, epochs + 1): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) start = time.time() for batch_counter in range(1, n_batch_per_epoch + 1): X_transformed_batch, X_orig_batch = next(out_train_disc) # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch( X_transformed_batch, X_orig_batch, generator_model, batch_counter, patch_size, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = next(out_train_gen) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) # Set labels to 1 (real) to maximize the discriminator loss y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True metrics = [("D logloss", disc_loss), ("G tot", gen_loss[0]), ("G L1", gen_loss[1]), ("G logloss", gen_loss[2])] progbar.add(batch_size, values=metrics) logs = {k: v for (k, v) in metrics} logs["size"] = batch_size tensorboard.on_batch_end(batch_counter, logs=logs) # Save images for visualization if batch_counter % save_images_every_n_batches == 0: # Get new images from validation data_utils.plot_generated_batch( X_transformed_batch, X_orig_batch, generator_model, os.path.join(logs_dir, "current_batch_training.png")) X_transformed_batch, X_orig_batch = next(out_val) data_utils.plot_generated_batch( X_transformed_batch, X_orig_batch, generator_model, os.path.join(logs_dir, "current_batch_validation.png")) print("") print('Epoch %s/%s, Time: %s' % (e, epochs, time.time() - start)) tensorboard.on_epoch_end(e, logs=logs) if (save_model_every_n_epochs >= 1 and e % save_model_every_n_epochs == 0) or \ (e == epochs): print("Saving model for epoch {}...".format(e), end="") sys.stdout.flush() gen_weights_path = os.path.join( model_dir, 'gen_weights_epoch{:03d}.h5'.format(e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join( model_dir, 'disc_weights_epoch{:03d}.h5'.format(e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join( model_dir, 'DCGAN_weights_epoch{:03d}.h5'.format(e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) print("done") except KeyboardInterrupt: pass enq_train_gen.stop() enq_train_disc.stop() enq_val.stop()
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] model_name = kwargs["model_name"] generator = kwargs["generator"] image_data_format = kwargs["image_data_format"] img_dim = kwargs["img_dim"] patch_size = kwargs["patch_size"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["use_label_smoothing"] label_flipping = kwargs["label_flipping"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) #general_utils.setup_logging(model_name) # Load and rescale data #X_full_train, X_sketch_train, X_full_val, X_sketch_val = data_utils.load_data(dset, image_data_format) img_dim = (256,256,3) # Manual entry # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model generator_model = models.load("generator_unet_%s" % generator, img_dim, nb_patch, bn_mode, use_mbd, batch_size) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, bn_mode, use_mbd, batch_size) generator_model.compile(loss="mae", optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 best_loss=[100]*3 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_full_batch, X_sketch_batch in data_utils.facades_generator(img_dim,batch_size=batch_size): X_gen, X_gen_target = next(data_utils.facades_generator(img_dim,batch_size=batch_size)) generator_model.train_on_batch(X_gen, X_gen_target) # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch(X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # X_disc, y_disc # Create a batch to feed the generator model X_gen, X_gen_target = next(data_utils.facades_generator(img_dim,batch_size=batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G tot", gen_loss[0]), ("G L1", gen_loss[1]), ("G logloss", gen_loss[2])]) # Save images for visualization if batch_counter % (n_batch_per_epoch / 2) == 0: # Get new images from validation figure_name = "training_"+str(e) data_utils.plot_generated_batch(X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, figure_name) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) if e % 5 == 0: gen_weights_path = os.path.join('../../models/%s/gen_weights_epoch%s.h5' % (model_name, e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join('../../models/%s/disc_weights_epoch%s.h5' % (model_name, e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join('../../models/%s/DCGAN_weights_epoch%s.h5' % (model_name, e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) Best_gen_L1_weights_path = os.path.join('../../models/%s/best_gen_L1_weights_epoch.h5' % (model_name)) if(gen_loss[1]<=best_loss[1]): generator_model.save_weights(Best_gen_L1_weights_path, overwrite=True) best_loss[1]=gen_loss[1] Best_gen_Totweights_path = os.path.join('../../models/%s/best_gen_Totweights_epoch.h5' % (model_name)) if(gen_loss[0]<=best_loss[0]): generator_model.save_weights(Best_gen_Totweights_path, overwrite=True) best_loss[0]=gen_loss[0] except KeyboardInterrupt: pass
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters img_dim = kwargs["img_dim"] patch_size = kwargs["patch_size"] image_data_format = kwargs["image_data_format"] generator_type = kwargs["generator_type"] dset = kwargs["dset"] use_identity_image = kwargs["use_identity_image"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] augment_data = kwargs["augment_data"] model_name = kwargs["model_name"] save_weights_every_n_epochs = kwargs["save_weights_every_n_epochs"] visualize_images_every_n_epochs = kwargs["visualize_images_every_n_epochs"] save_only_last_n_weights = kwargs["save_only_last_n_weights"] use_mbd = kwargs["use_mbd"] label_smoothing = kwargs["use_label_smoothing"] label_flipping_prob = kwargs["label_flipping_prob"] use_l1_weighted_loss = kwargs["use_l1_weighted_loss"] prev_model = kwargs["prev_model"] change_model_name_to_prev_model = kwargs["change_model_name_to_prev_model"] discriminator_optimizer = kwargs["discriminator_optimizer"] n_run_of_gen_for_1_run_of_disc = kwargs["n_run_of_gen_for_1_run_of_disc"] load_all_data_at_once = kwargs["load_all_data_at_once"] MAX_FRAMES_PER_GIF = kwargs["MAX_FRAMES_PER_GIF"] dont_train = kwargs["dont_train"] # batch_size = args.batch_size # n_batch_per_epoch = args.n_batch_per_epoch # nb_epoch = args.nb_epoch # save_weights_every_n_epochs = args.save_weights_every_n_epochs # generator_type = args.generator_type # patch_size = args.patch_size # label_smoothing = False # label_flipping_prob = False # dset = args.dset # use_mbd = False if dont_train: # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) generator_model = models.load("generator_unet_%s" % generator_type, img_dim, nb_patch, use_mbd, batch_size, model_name) generator_model.compile(loss='mae', optimizer='adam') return generator_model # Check and make the dataset # If .h5 file of dset is not present, try making it if load_all_data_at_once: if not os.path.exists("../../data/processed/%s_data.h5" % dset): print("dset %s_data.h5 not present in '../../data/processed'!" % dset) if not os.path.exists("../../data/%s/" % dset): print("dset folder %s not present in '../../data'!\n\nERROR: Dataset .h5 file not made, and dataset not available in '../../data/'.\n\nQuitting." % dset) return else: if not os.path.exists("../../data/%s/train" % dset) or not os.path.exists("../../data/%s/val" % dset) or not os.path.exists("../../data/%s/test" % dset): print("'train', 'val' or 'test' folders not present in dset folder '../../data/%s'!\n\nERROR: Dataset must contain 'train', 'val' and 'test' folders.\n\nQuitting." % dset) return else: print("Making %s dataset" % dset) subprocess.call(['python3', '../data/make_dataset.py', '../../data/%s' % dset, '3']) print("Done!") else: if not os.path.exists(dset): print("dset does not exist! Given:", dset) return if not os.path.exists(os.path.join(dset, 'train')): print("dset does not contain a 'train' dir! Given dset:", dset) return if not os.path.exists(os.path.join(dset, 'val')): print("dset does not contain a 'val' dir! Given dset:", dset) return epoch_size = n_batch_per_epoch * batch_size init_epoch = 0 if prev_model: print('\n\nLoading prev_model from', prev_model, '...\n\n') prev_model_latest_gen = sorted(glob.glob(os.path.join('../../models/', prev_model, '*gen*epoch*.h5')))[-1] prev_model_latest_disc = sorted(glob.glob(os.path.join('../../models/', prev_model, '*disc*epoch*.h5')))[-1] prev_model_latest_DCGAN = sorted(glob.glob(os.path.join('../../models/', prev_model, '*DCGAN*epoch*.h5')))[-1] print(prev_model_latest_gen, prev_model_latest_disc, prev_model_latest_DCGAN) if change_model_name_to_prev_model: # Find prev model name, epoch model_name = prev_model_latest_DCGAN.split('models')[-1].split('/')[1] init_epoch = int(prev_model_latest_DCGAN.split('epoch')[1][:5]) + 1 # img_dim = X_target_train.shape[-3:] # img_dim = (256, 256, 3) # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) if discriminator_optimizer == 'sgd': opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) elif discriminator_optimizer == 'adam': opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model generator_model = models.load("generator_unet_%s" % generator_type, img_dim, nb_patch, use_mbd, batch_size, model_name) generator_model.compile(loss='mae', optimizer=opt_dcgan) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, use_mbd, batch_size, model_name) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) if use_l1_weighted_loss: loss = [l1_weighted_loss, 'binary_crossentropy'] else: loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) # Load prev_model if prev_model: generator_model.load_weights(prev_model_latest_gen) discriminator_model.load_weights(prev_model_latest_disc) DCGAN_model.load_weights(prev_model_latest_DCGAN) # Load .h5 data all at once print('\n\nLoading data...\n\n') check_this_process_memory() if load_all_data_at_once: X_target_train, X_sketch_train, X_target_val, X_sketch_val = data_utils.load_data(dset, image_data_format) check_this_process_memory() print('X_target_train: %.4f' % (X_target_train.nbytes/2**30), "GB") print('X_sketch_train: %.4f' % (X_sketch_train.nbytes/2**30), "GB") print('X_target_val: %.4f' % (X_target_val.nbytes/2**30), "GB") print('X_sketch_val: %.4f' % (X_sketch_val.nbytes/2**30), "GB") # To generate training data X_target_batch_gen_train, X_sketch_batch_gen_train = data_utils.data_generator(X_target_train, X_sketch_train, batch_size, augment_data=augment_data) X_target_batch_gen_val, X_sketch_batch_gen_val = data_utils.data_generator(X_target_val, X_sketch_val, batch_size, augment_data=False) # Load data from images through an ImageDataGenerator else: X_batch_gen_train = data_utils.data_generator_from_dir(os.path.join(dset, 'train'), target_size=(img_dim[0], 2*img_dim[1]), batch_size=batch_size) X_batch_gen_val = data_utils.data_generator_from_dir(os.path.join(dset, 'val'), target_size=(img_dim[0], 2*img_dim[1]), batch_size=batch_size) check_this_process_memory() # Setup environment (logging directory etc) general_utils.setup_logging(**kwargs) # Losses disc_losses = [] gen_total_losses = [] gen_L1_losses = [] gen_log_losses = [] # Start training print("\n\nStarting training...\n\n") # For each epoch for e in range(nb_epoch): # Initialize progbar and batch counter # progbar = generic_utils.Progbar(epoch_size) batch_counter = 0 gen_total_loss_epoch = 0 gen_L1_loss_epoch = 0 gen_log_loss_epoch = 0 start = time.time() # For each batch # for X_target_batch, X_sketch_batch in data_utils.gen_batch(X_target_train, X_sketch_train, batch_size): for batch in range(n_batch_per_epoch): # Create a batch to feed the discriminator model if load_all_data_at_once: X_target_batch_train, X_sketch_batch_train = next(X_target_batch_gen_train), next(X_sketch_batch_gen_train) else: X_target_batch_train, X_sketch_batch_train = data_utils.load_data_from_data_generator_from_dir(X_batch_gen_train, img_dim=img_dim, augment_data=augment_data, use_identity_image=use_identity_image) X_disc, y_disc = data_utils.get_disc_batch(X_target_batch_train, X_sketch_batch_train, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping_prob=label_flipping_prob) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model if load_all_data_at_once: X_gen_target, X_gen_sketch = next(X_target_batch_gen_train), next(X_sketch_batch_gen_train) else: X_gen_target, X_gen_sketch = data_utils.load_data_from_data_generator_from_dir(X_batch_gen_train, img_dim=img_dim, augment_data=augment_data, use_identity_image=use_identity_image) y_gen_target = np.zeros((X_gen_target.shape[0], 2), dtype=np.uint8) y_gen_target[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False # Train generator for _ in range(n_run_of_gen_for_1_run_of_disc-1): gen_loss = DCGAN_model.train_on_batch(X_gen_sketch, [X_gen_target, y_gen_target]) gen_total_loss_epoch += gen_loss[0]/n_run_of_gen_for_1_run_of_disc gen_L1_loss_epoch += gen_loss[1]/n_run_of_gen_for_1_run_of_disc gen_log_loss_epoch += gen_loss[2]/n_run_of_gen_for_1_run_of_disc if load_all_data_at_once: X_gen_target, X_gen_sketch = next(X_target_batch_gen_train), next(X_sketch_batch_gen_train) else: X_gen_target, X_gen_sketch = data_utils.load_data_from_data_generator_from_dir(X_batch_gen_train, img_dim=img_dim, augment_data=augment_data, use_identity_image=use_identity_image) gen_loss = DCGAN_model.train_on_batch(X_gen_sketch, [X_gen_target, y_gen_target]) # Add losses gen_total_loss_epoch += gen_loss[0]/n_run_of_gen_for_1_run_of_disc gen_L1_loss_epoch += gen_loss[1]/n_run_of_gen_for_1_run_of_disc gen_log_loss_epoch += gen_loss[2]/n_run_of_gen_for_1_run_of_disc # Unfreeze the discriminator discriminator_model.trainable = True # Progress # progbar.add(batch_size, values=[("D logloss", disc_loss), # ("G tot", gen_loss[0]), # ("G L1", gen_loss[1]), # ("G logloss", gen_loss[2])]) print("Epoch", str(init_epoch+e+1), "batch", str(batch+1), "D_logloss", disc_loss, "G_tot", gen_loss[0], "G_L1", gen_loss[1], "G_log", gen_loss[2]) gen_total_loss = gen_total_loss_epoch/n_batch_per_epoch gen_L1_loss = gen_L1_loss_epoch/n_batch_per_epoch gen_log_loss = gen_log_loss_epoch/n_batch_per_epoch disc_losses.append(disc_loss) gen_total_losses.append(gen_total_loss) gen_L1_losses.append(gen_L1_loss) gen_log_losses.append(gen_log_loss) # Save images for visualization if (e + 1) % visualize_images_every_n_epochs == 0: data_utils.plot_generated_batch(X_target_batch_train, X_sketch_batch_train, generator_model, batch_size, image_data_format, model_name, "training", init_epoch + e + 1, MAX_FRAMES_PER_GIF) # Get new images for validation if load_all_data_at_once: X_target_batch_val, X_sketch_batch_val = next(X_target_batch_gen_val), next(X_sketch_batch_gen_val) else: X_target_batch_val, X_sketch_batch_val = data_utils.load_data_from_data_generator_from_dir(X_batch_gen_val, img_dim=img_dim, augment_data=False, use_identity_image=use_identity_image) # Predict and validate data_utils.plot_generated_batch(X_target_batch_val, X_sketch_batch_val, generator_model, batch_size, image_data_format, model_name, "validation", init_epoch + e + 1, MAX_FRAMES_PER_GIF) # Plot losses data_utils.plot_losses(disc_losses, gen_total_losses, gen_L1_losses, gen_log_losses, model_name, init_epoch) # Save weights if (e + 1) % save_weights_every_n_epochs == 0: # Delete all but the last n weights purge_weights(save_only_last_n_weights, model_name) # Save gen weights gen_weights_path = os.path.join('../../models/%s/gen_weights_epoch%05d_discLoss%.04f_genTotL%.04f_genL1L%.04f_genLogL%.04f.h5' % (model_name, init_epoch + e, disc_losses[-1], gen_total_losses[-1], gen_L1_losses[-1], gen_log_losses[-1])) print("Saving", gen_weights_path) generator_model.save_weights(gen_weights_path, overwrite=True) # Save disc weights disc_weights_path = os.path.join('../../models/%s/disc_weights_epoch%05d_discLoss%.04f_genTotL%.04f_genL1L%.04f_genLogL%.04f.h5' % (model_name, init_epoch + e, disc_losses[-1], gen_total_losses[-1], gen_L1_losses[-1], gen_log_losses[-1])) print("Saving", disc_weights_path) discriminator_model.save_weights(disc_weights_path, overwrite=True) # Save DCGAN weights DCGAN_weights_path = os.path.join('../../models/%s/DCGAN_weights_epoch%05d_discLoss%.04f_genTotL%.04f_genL1L%.04f_genLogL%.04f.h5' % (model_name, init_epoch + e, disc_losses[-1], gen_total_losses[-1], gen_L1_losses[-1], gen_log_losses[-1])) print("Saving", DCGAN_weights_path) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) check_this_process_memory() print('[{0:%Y/%m/%d %H:%M:%S}] Epoch {1:d}/{2:d} END, Time taken: {3:.4f} seconds'.format(datetime.datetime.now(), init_epoch + e + 1, init_epoch + nb_epoch, time.time() - start)) print('------------------------------------------------------------------------------------') except KeyboardInterrupt: pass # SAVE THE MODEL try: # Save the model as it is, so that it can be loaded using - # ```from keras.models import load_model; gen = load_model('generator_latest.h5')``` gen_weights_path = '../../models/%s/generator_latest.h5' % (model_name) print("Saving", gen_weights_path) generator_model.save(gen_weights_path, overwrite=True) # Save model as json string generator_model_json_string = generator_model.to_json() print("Saving", '../../models/%s/generator_latest.txt' % model_name) with open('../../models/%s/generator_latest.txt' % model_name, 'w') as outfile: a = outfile.write(generator_model_json_string) # Save model as json generator_model_json_data = json.loads(generator_model_json_string) print("Saving", '../../models/%s/generator_latest.json' % model_name) with open('../../models/%s/generator_latest.json' % model_name, 'w') as outfile: json.dump(generator_model_json_data, outfile) except: print(sys.exc_info()[0]) print("Done.") return generator_model
DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=G_opt) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=D_opt) # Start training print("Start training") for e in range(1, nb_epoch + 1): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) print('Epoch %s/%s' % (e, nb_epoch)) for b in range(1, n_batch_per_epoch + 1): X_HR_batch, X_LR_batch = gen_batch(train_list, batch_size) # Create a batch to feed the discriminator model X_disc, y_disc = get_disc_batch(X_HR_batch, X_LR_batch, generator_model, b) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = gen_batch(train_list, batch_size) y_gen = np.zeros((X_gen.shape[0], 1), dtype=np.uint8) y_gen[:, 0] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True
def train(cat_dim, noise_dim, batch_size, n_batch_per_epoch, nb_epoch, dset="mnist"): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ general_utils.setup_logging("IG") # Load and rescale data if dset == "mnist": print("loading mnist data") X_real_train, Y_real_train, X_real_test, Y_real_test = data_utils.load_mnist( ) # pick 1000 sample for testing # X_real_test = X_real_test[-1000:] # Y_real_test = Y_real_test[-1000:] img_dim = X_real_train.shape[-3:] epoch_size = n_batch_per_epoch * batch_size try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) opt_discriminator = Adam(lr=2E-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-4, momentum=0.9, nesterov=True) # Load generator model generator_model = models.load("generator_deconv", cat_dim, noise_dim, img_dim, batch_size, dset=dset) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", cat_dim, noise_dim, img_dim, batch_size, dset=dset) generator_model.compile(loss='mse', optimizer=opt_discriminator) # stop the discriminator to learn while in generator is learning discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, cat_dim, noise_dim) list_losses = ['binary_crossentropy', 'categorical_crossentropy'] list_weights = [1, 1] DCGAN_model.compile(loss=list_losses, loss_weights=list_weights, optimizer=opt_dcgan) # Multiple discriminator losses # allow the discriminator to learn again discriminator_model.trainable = True discriminator_model.compile(loss=list_losses, loss_weights=list_weights, optimizer=opt_discriminator) # Start training print("Start training") for e in range(nb_epoch + 1): # Initialize progbar and batch counter # progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() print("Epoch: {}".format(e)) for X_real_batch, Y_real_batch in zip( data_utils.gen_batch(X_real_train, batch_size), data_utils.gen_batch(Y_real_train, batch_size)): # Create a batch to feed the discriminator model X_disc_fake, y_disc_fake, noise_sample = data_utils.get_disc_batch( X_real_batch, Y_real_batch, generator_model, batch_size, cat_dim, noise_dim, type="fake") X_disc_real, y_disc_real = data_utils.get_disc_batch( X_real_batch, Y_real_batch, generator_model, batch_size, cat_dim, noise_dim, type="real") # Update the discriminator disc_loss_fake = discriminator_model.train_on_batch( X_disc_fake, [y_disc_fake, Y_real_batch]) disc_loss_real = discriminator_model.train_on_batch( X_disc_real, [y_disc_real, Y_real_batch]) disc_loss = disc_loss_fake + disc_loss_real # Create a batch to feed the generator model # X_noise, y_gen = data_utils.get_gen_batch(batch_size, cat_dim, noise_dim) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch( [Y_real_batch, noise_sample], [y_disc_real, Y_real_batch]) # Unfreeze the discriminator discriminator_model.trainable = True # training validation p_real_batch, p_Y_batch = discriminator_model.predict( X_real_batch, batch_size=batch_size) acc_train = data_utils.accuracy(p_Y_batch, Y_real_batch) batch_counter += 1 # progbar.add(batch_size, values=[("D tot", disc_loss[0]), # ("D cat", disc_loss[2]), # ("G tot", gen_loss[0]), # ("G cat", gen_loss[2]), # ("P Real:", p_real_batch), # ("Q acc", acc_train)]) # Save images for visualization if batch_counter % (n_batch_per_epoch / 2) == 0 and e % 10 == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, batch_size, cat_dim, noise_dim, e) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) _, p_Y_test = discriminator_model.predict( X_real_test, batch_size=X_real_test.shape[0]) acc_test = data_utils.accuracy(p_Y_test, Y_real_test) print("Epoch: {} Accuracy: {}".format(e + 1, acc_test)) if e % 1000 == 0: gen_weights_path = os.path.join( '../../models/IG/gen_weights.h5') generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join( '../../models/IG/disc_weights.h5') discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join( '../../models/IG/DCGAN_weights.h5') DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) except KeyboardInterrupt: pass
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] model_name = kwargs["model_name"] generator = kwargs["generator"] image_data_format = kwargs["image_data_format"] img_dim = kwargs["img_dim"] patch_size = kwargs["patch_size"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["use_label_smoothing"] label_flipping = kwargs["label_flipping"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] lastLayerActivation=kwargs["lastLayerActivation"] PercentageOfTrianable=kwargs["PercentageOfTrianable"] SpecificPathStr=kwargs["SpecificPathStr"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) #general_utils.setup_logging(model_name) # Load and rescale data #X_full_train, X_sketch_train, X_full_val, X_sketch_val = data_utils.load_data(dset, image_data_format) img_dim = (256,256,3) # Manual entry # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # Load generator model """ generator_model = models.load("generator_unet_%s" % generator, img_dim, nb_patch, bn_mode, use_mbd, batch_size) """ generator_model=CreatErrorMapModel(input_shape=img_dim,lastLayerActivation=lastLayerActivation, PercentageOfTrianable=PercentageOfTrianable) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, bn_mode, use_mbd, batch_size) generator_model.compile(loss='mae', optimizer=opt_discriminator) #------------------------------------------------------------------------------- logpath=os.path.join('../../log','DepthMapWith'+lastLayerActivation+str(PercentageOfTrianable)+'UnTr'+SpecificPathStr) modelPath=os.path.join('../../models','DepthMapwith'+lastLayerActivation+str(PercentageOfTrianable)+'Untr'+SpecificPathStr) os.makedirs(logpath, exist_ok=True) os.makedirs(modelPath, exist_ok=True)os.makedirs(modelPath, exist_ok=True) #-----------------------PreTraining Depth Map------------------------------------- nb_train_samples = 2000 nb_validation_samples = epochs = 20 history=whole_model.fit_generator(data_utils.facades_generator(img_dim,batch_size=batch_size), samples_per_epoch=nb_train_samples,epochs=epochs,validation_data=data_utils.facades_generator(img_dim,batch_size=batch_size),nb_val_samples=nb_validation_ samples, callbacks=[ keras.callbacks.ModelCheckpoint(os.path.join(modelPath,'DepthMap_weightsBestLoss.h5'), monitor='val_loss', verbose=1, save_best_only=True), keras.callbacks.ModelCheckpoint(os.path.join(modelPath,'DepthMap_weightsBestAcc.h5'), monitor='acc', verbose=1, save_best_only=True), keras.callbacks.ReduceLROnPlateau(monitor='loss', factor=0.1, patience=2, verbose=1, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0), keras.callbacks.TensorBoard(log_dir=logpath, histogram_freq=0, batch_size=batchSize, write_graph=True, write_grads=False, write_images=True, embeddin gs_freq=0, embeddings_layer_names=None, embeddings_metadata=None)],) #------------------------------------------------------------------------------------ discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_full_batch, X_sketch_batch in data_utils.facades_generator(img_dim,batch_size=batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch(X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # X_disc, y_disc # Create a batch to feed the generator model X_gen_target, X_gen = next(data_utils.facades_generator(img_dim,batch_size=batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G tot", gen_loss[0]), ("G L1", gen_loss[1]), ("G logloss", gen_loss[2])]) # Save images for visualization if batch_counter % (n_batch_per_epoch / 2) == 0: # Get new images from validation figure_name = "training_"+str(e) data_utils.plot_generated_batch(X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, figure_name) if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) if e % 5 == 0: gen_weights_path = os.path.join('../../models/%s/gen_weights_epoch%s.h5' % (model_name, e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join('../../models/%s/disc_weights_epoch%s.h5' % (model_name, e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join('../../models/%s/DCGAN_weights_epoch%s.h5' % (model_name, e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True)
def train(**kwargs): """ Train standard DCGAN model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters generator = kwargs["generator"] dset = kwargs["dset"] img_dim = kwargs["img_dim"] nb_epoch = kwargs["nb_epoch"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] bn_mode = kwargs["bn_mode"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] image_dim_ordering = kwargs["image_dim_ordering"] epoch_size = n_batch_per_epoch * batch_size print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("DCGAN") # Load and normalize data X_real_train = data_utils.load_image_dataset(dset, img_dim, image_dim_ordering) # Get the full real image dimension img_dim = X_real_train.shape[-3:] # Create optimizers opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_D = data_utils.get_optimizer(opt_D, lr_D) ####################### # Load models ####################### noise_dim = (noise_dim,) if generator == "upsampling": generator_model = models.generator_upsampling(noise_dim, img_dim, bn_mode, dset=dset) else: generator_model = models.generator_deconv(noise_dim, img_dim, bn_mode, batch_size, dset=dset) discriminator_model = models.discriminator(img_dim, bn_mode) DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_dim) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) discriminator_model.trainable = False DCGAN_model.compile(loss=models.wasserstein, optimizer=opt_G) discriminator_model.trainable = True discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) # Global iteration counter for generator updates gen_iterations = 0 ################# # Start training ################ for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: if gen_iterations < 25 or gen_iterations % 500 == 0: disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] for disc_it in range(disc_iterations): # Clip discriminator weights for l in discriminator_model.layers: weights = l.get_weights() weights = [np.clip(w, clamp_lower, clamp_upper) for w in weights] l.set_weights(weights) X_real_batch = next(data_utils.gen_batch(X_real_train, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch(X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale) # Update the discriminator disc_loss_real = discriminator_model.train_on_batch(X_disc_real, -np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch(X_disc_gen, np.ones(X_disc_gen.shape[0])) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, -np.ones(X_gen.shape[0])) # Unfreeze the discriminator discriminator_model.trainable = True gen_iterations += 1 batch_counter += 1 progbar.add(batch_size, values=[("Loss_D", -np.mean(list_disc_loss_real) - np.mean(list_disc_loss_gen)), ("Loss_D_real", -np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", -gen_loss)]) # Save images for visualization ~2 times per epoch if batch_counter % (n_batch_per_epoch / 2) == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, batch_size, noise_dim, image_dim_ordering) print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) # Save model weights (by default, every 5 epochs) data_utils.save_model_weights(generator_model, discriminator_model, DCGAN_model, e)
def train(**kwargs): """ Train standard DCGAN model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters generator = kwargs["generator"] discriminator = kwargs["discriminator"] dset = kwargs["dset"] img_dim = kwargs["img_dim"] nb_epoch = kwargs["nb_epoch"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] bn_mode = kwargs["bn_mode"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] use_mbd = kwargs["use_mbd"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] image_dim_ordering = kwargs["image_dim_ordering"] epoch_size = n_batch_per_epoch * batch_size deterministic = kwargs["deterministic"] inject_noise = kwargs["inject_noise"] model = kwargs["model"] no_supertrain = kwargs["no_supertrain"] pureGAN = kwargs["pureGAN"] lsmooth = kwargs["lsmooth"] simple_disc = kwargs["simple_disc"] resume = kwargs["resume"] name = kwargs["name"] wd = kwargs["wd"] history_size = kwargs["history_size"] monsterClass = kwargs["monsterClass"] print("\nExperiment parameters:") for key in kwargs.keys(): print key, kwargs[key] print("\n") # Setup environment (logging directory etc) general_utils.setup_logging("DCGAN") # Load and normalize data if dset == "mnistM": X_source_train, Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='mnist') X_dest_train, Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='mnistM') #code.interact(local=locals()) elif dset == "washington_vandal50k": X_source_train = data_utils.load_image_dataset(img_dim, image_dim_ordering, dset='washington') X_dest_train = data_utils.load_image_dataset(img_dim, image_dim_ordering, dset='vandal50k') elif dset == "washington_vandal12classes": X_source_train = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='washington12classes') X_dest_train = data_utils.load_image_dataset(img_dim, image_dim_ordering, dset='vandal12classes') elif dset == "washington_vandal12classesNoBackground": X_source_train, Y_source_train, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='washington12classes') X_dest_train, Y_dest_train, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='vandal12classesNoBackground') elif dset == "Wash_Vand_12class_LMDB": X_source_train, Y_source_train, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='Wash_12class_LMDB') elif dset == "OfficeDslrToAmazon": X_source_train, Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='OfficeDslr') X_dest_train, Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='OfficeAmazon') elif dset == "bedrooms": X_source_train, Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='bedrooms_small') X_dest_train, Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='bedrooms') elif dset == "Vand_Vand_12class_LMDB": X_source_train, Y_source_train, X_source_test, Y_source_test, n_classes1 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='Vand_12class_LMDB_Background') X_dest_train, Y_dest_train, X_dest_test, Y_dest_test, n_classes2 = data_utils.load_image_dataset( img_dim, image_dim_ordering, dset='Vand_12class_LMDB') else: print "dataset not supported" if n_classes1 != n_classes2: #sanity check print "number of classes mismatch between source and dest domains" n_classes = n_classes1 # img_source_dim = X_source_train.shape[-3:] # is it backend agnostic? img_dest_dim = X_dest_train.shape[-3:] # Create optimizers opt_D = data_utils.get_optimizer(opt_D, lr_D) opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_C = data_utils.get_optimizer('SGD', 0.01) ####################### # Load models ####################### noise_dim = (noise_dim, ) if generator == "upsampling": generator_model = models.generator_upsampling_mnistM(noise_dim, img_source_dim, img_dest_dim, bn_mode, deterministic, pureGAN, inject_noise, wd, dset=dset) else: generator_model = models.generator_deconv(noise_dim, img_dest_dim, bn_mode, batch_size, dset=dset) if simple_disc: discriminator_model = models.discriminator_naive( img_dest_dim, bn_mode, model, wd, inject_noise, n_classes, use_mbd) DCGAN_model = models.DCGAN_naive(generator_model, discriminator_model, noise_dim, img_source_dim) elif discriminator == "disc_resnet": discriminator_model = models.discriminatorResNet( img_dest_dim, bn_mode, model, wd, monsterClass, inject_noise, n_classes, use_mbd) DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_source_dim, img_dest_dim, monsterClass) else: discriminator_model = models.disc1(img_dest_dim, bn_mode, model, wd, monsterClass, inject_noise, n_classes, use_mbd) DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_source_dim, img_dest_dim, monsterClass) ####special options for bedrooms dataset: if dset == "bedrooms": generator_model = models.generator_dcgan(noise_dim, img_source_dim, img_dest_dim, bn_mode, deterministic, pureGAN, inject_noise, wd) discriminator_model = models.discriminator_naive( img_dest_dim, bn_mode, model, wd, inject_noise, n_classes, use_mbd, model_name="discriminator_naive") DCGAN_model = models.DCGAN_naive(generator_model, discriminator_model, noise_dim, img_source_dim) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) models.make_trainable(discriminator_model, False) #discriminator_model.trainable = False if model == 'wgan': DCGAN_model.compile(loss=models.wasserstein, optimizer=opt_G) models.make_trainable(discriminator_model, True) discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) if model == 'lsgan': if simple_disc: DCGAN_model.compile(loss=['mse'], optimizer=opt_G) models.make_trainable(discriminator_model, True) discriminator_model.compile(loss=['mse'], optimizer=opt_D) elif monsterClass: DCGAN_model.compile(loss=['categorical_crossentropy'], optimizer=opt_G) models.make_trainable(discriminator_model, True) discriminator_model.compile(loss=['categorical_crossentropy'], optimizer=opt_D) else: DCGAN_model.compile(loss=['mse', 'categorical_crossentropy'], loss_weights=[1.0, 1.0], optimizer=opt_G) models.make_trainable(discriminator_model, True) discriminator_model.compile( loss=['mse', 'categorical_crossentropy'], loss_weights=[1.0, 1.0], optimizer=opt_D) visualize = True if resume: ########loading previous saved model weights data_utils.load_model_weights(generator_model, discriminator_model, DCGAN_model, name) ##################### ###classifier ##################### if not ((dset == 'mnistM') or (dset == 'bedrooms')): classifier, GenToClassifierModel = classifier_build_test( img_dest_dim, n_classes, generator_model, noise_dim, noise_scale, img_source_dim, opt_C, X_source_test, Y_source_test, X_dest_test, Y_dest_test, wd=0.0001) gen_iterations = 0 max_history_size = int(history_size * batch_size) img_buffer = ImageHistoryBuffer((0, ) + img_source_dim, max_history_size, batch_size, n_classes) ################# # Start training ################ for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() while batch_counter < n_batch_per_epoch: if no_supertrain is None: if (gen_iterations < 25) and (not resume): disc_iterations = 100 if gen_iterations % 500 == 0: disc_iterations = 10 else: disc_iterations = kwargs["disc_iterations"] else: if (gen_iterations < 25) and (not resume): disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] list_gen_loss = [] for disc_it in range(disc_iterations): # Clip discriminator weights #for l in discriminator_model.layers: # weights = l.get_weights() # weights = [np.clip(w, clamp_lower, clamp_upper) for w in weights] # l.set_weights(weights) X_dest_batch, Y_dest_batch, idx_dest_batch = next( data_utils.gen_batch(X_dest_train, Y_dest_train, batch_size)) X_source_batch, Y_source_batch, idx_source_batch = next( data_utils.gen_batch(X_source_train, Y_source_train, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch( X_dest_batch, generator_model, batch_counter, batch_size, noise_dim, X_source_batch, noise_scale=noise_scale) if model == 'wgan': # Update the discriminator current_labels_real = -np.ones(X_disc_real.shape[0]) current_labels_gen = np.ones(X_disc_gen.shape[0]) if model == 'lsgan': if simple_disc: #for real domain I put [labels 0 0 0...0], for fake domain I put [0 0...0 labels] current_labels_real = np.ones(X_disc_real.shape[0]) #current_labels_gen = -np.ones(X_disc_gen.shape[0]) current_labels_gen = np.zeros(X_disc_gen.shape[0]) elif monsterClass: #for real domain I put [labels 0 0 0...0], for fake domain I put [0 0...0 labels] current_labels_real = np.concatenate( (Y_dest_batch, np.zeros((X_disc_real.shape[0], n_classes))), axis=1) current_labels_gen = np.concatenate((np.zeros( (X_disc_real.shape[0], n_classes)), Y_source_batch), axis=1) else: current_labels_real = [ np.ones(X_disc_real.shape[0]), Y_dest_batch ] Y_fake_batch = (1.0 / n_classes) * np.ones( [X_disc_gen.shape[0], n_classes]) current_labels_gen = [ np.zeros(X_disc_gen.shape[0]), Y_fake_batch ] #label smoothing #current_labels_real = np.multiply(current_labels_real, lsmooth) #usually lsmooth = 0.7 disc_loss_real = discriminator_model.train_on_batch( X_disc_real, current_labels_real) img_buffer.add_to_buffer(X_disc_gen, current_labels_gen, batch_size) bufferImages, bufferLabels = img_buffer.get_from_buffer( batch_size) disc_loss_gen = discriminator_model.train_on_batch( bufferImages, bufferLabels) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) X_source_batch2, Y_source_batch2, idx_source_batch2 = next( data_utils.gen_batch(X_source_train, Y_source_train, batch_size)) # w1 = classifier.get_weights() #FOR DEBUG if model == 'wgan': gen_loss = DCGAN_model.train_on_batch([X_gen, X_source_batch2], -np.ones(X_gen.shape[0])) if model == 'lsgan': if simple_disc: gen_loss = DCGAN_model.train_on_batch( [X_gen, X_source_batch2], np.ones(X_gen.shape[0])) #TRYING SAME BATCH OF DISC? elif monsterClass: labels_gen = np.concatenate( (Y_source_batch2, np.zeros((X_disc_real.shape[0], n_classes))), axis=1) gen_loss = DCGAN_model.train_on_batch( [X_gen, X_source_batch2], labels_gen) else: gen_loss = DCGAN_model.train_on_batch( [X_gen, X_source_batch2], [np.ones(X_gen.shape[0]), Y_source_batch2]) # gen_loss2 = GenToClassifierModel.train_on_batch([X_gen,X_source_batch2], Y_source_batch2) # w2 = classifier.get_weights() #FOR DEBUG # for a,b in zip(w1, w2): # if np.all(a == b): # print "no bug in GEN model update" # else: # print "BUG IN GEN MODEL UPDATE" list_gen_loss.append(gen_loss) gen_iterations += 1 batch_counter += 1 progbar.add(batch_size, values=[("Loss_D", 0.5 * np.mean(list_disc_loss_real) + 0.5 * np.mean(list_disc_loss_gen)), ("Loss_D_real", np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", np.mean(list_gen_loss))]) # plot images 1 times per epoch if batch_counter % (n_batch_per_epoch) == 0: X_source_batch_plot, Y_source_batch_plot, idx_source_plot = next( data_utils.gen_batch(X_source_test, Y_source_test, batch_size=32)) data_utils.plot_generated_batch(X_dest_test, X_source_test, generator_model, noise_dim, image_dim_ordering, idx_source_plot, batch_size=32) if gen_iterations % (n_batch_per_epoch * 5) == 0: if visualize: BIG_ASS_VISUALIZATION_slerp(X_source_train[1], generator_model, noise_dim) print("Dest labels:") print(Y_dest_test[idx_source_plot].argmax(1)) print("Source labels:") print(Y_source_batch_plot.argmax(1)) print('\nEpoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) # Save model weights (by default, every 5 epochs) data_utils.save_model_weights(generator_model, discriminator_model, DCGAN_model, e, name)
def train(**kwargs): """ Train model Load the whole train data in memory for faster operations args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] nb_epoch = kwargs["nb_epoch"] model_name = kwargs["model_name"] generator = kwargs["generator"] image_data_format = kwargs["image_data_format"] img_dim = kwargs["img_dim"] patch_size = kwargs["patch_size"] bn_mode = kwargs["bn_mode"] label_smoothing = kwargs["use_label_smoothing"] label_flipping = kwargs["label_flipping"] dset = kwargs["dset"] use_mbd = kwargs["use_mbd"] pretrained_model_path = kwargs["pretrained_model_path"] epoch_size = n_batch_per_epoch * batch_size # Setup environment (logging directory etc) general_utils.setup_logging(model_name) # Load and rescale data X_full_train, X_sketch_train, X_full_val, X_sketch_val = data_utils.load_data(dset, image_data_format) img_dim = X_full_train.shape[-3:] # Get the number of non overlapping patch and the size of input image to the discriminator nb_patch, img_dim_disc = data_utils.get_nb_patch(img_dim, patch_size, image_data_format) try: # Create optimizers opt_dcgan = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) # opt_discriminator = SGD(lr=1E-3, momentum=0.9, nesterov=True) opt_discriminator = Adam(lr=1E-3, beta_1=0.9, beta_2=0.999, epsilon=1e-08) load_pretrained = False if pretrained_model_path: load_pretrained = True # Load generator model generator_model = models.load("generator_unet_%s" % generator, img_dim, nb_patch, bn_mode, use_mbd, batch_size, load_pretrained) # Load discriminator model discriminator_model = models.load("DCGAN_discriminator", img_dim_disc, nb_patch, bn_mode, use_mbd, batch_size, load_pretrained) generator_model.compile(loss='mae', optimizer=opt_discriminator) discriminator_model.trainable = False DCGAN_model = models.DCGAN(generator_model, discriminator_model, img_dim, patch_size, image_data_format) loss = [l1_loss, 'binary_crossentropy'] loss_weights = [1E1, 1] DCGAN_model.compile(loss=loss, loss_weights=loss_weights, optimizer=opt_dcgan) discriminator_model.trainable = True discriminator_model.compile(loss='binary_crossentropy', optimizer=opt_discriminator) gen_loss = 100 disc_loss = 100 # Start training print("Start training") for e in range(nb_epoch): # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 1 start = time.time() for X_full_batch, X_sketch_batch in data_utils.gen_batch(X_full_train, X_sketch_train, batch_size): # Create a batch to feed the discriminator model X_disc, y_disc = data_utils.get_disc_batch(X_full_batch, X_sketch_batch, generator_model, batch_counter, patch_size, image_data_format, label_smoothing=label_smoothing, label_flipping=label_flipping) # Update the discriminator disc_loss = discriminator_model.train_on_batch(X_disc, y_disc) # Create a batch to feed the generator model X_gen_target, X_gen = next(data_utils.gen_batch(X_full_train, X_sketch_train, batch_size)) y_gen = np.zeros((X_gen.shape[0], 2), dtype=np.uint8) y_gen[:, 1] = 1 # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, [X_gen_target, y_gen]) # Unfreeze the discriminator discriminator_model.trainable = True batch_counter += 1 progbar.add(batch_size, values=[("D logloss", disc_loss), ("G tot", gen_loss[0]), ("G L1", gen_loss[1]), ("G logloss", gen_loss[2])]) # Save images for visualization if batch_counter % (n_batch_per_epoch / 2) == 0: # Get new images from validation data_utils.plot_generated_batch(X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, "training") X_full_batch, X_sketch_batch = next(data_utils.gen_batch(X_full_val, X_sketch_val, batch_size)) data_utils.plot_generated_batch(X_full_batch, X_sketch_batch, generator_model, batch_size, image_data_format, "validation") if batch_counter >= n_batch_per_epoch: break print("") print('Epoch %s/%s, Time: %s' % (e + 1, nb_epoch, time.time() - start)) if e % 5 == 0: gen_weights_path = os.path.join('../../models/%s/gen_weights_epoch%s.h5' % (model_name, e)) generator_model.save_weights(gen_weights_path, overwrite=True) disc_weights_path = os.path.join('../../models/%s/disc_weights_epoch%s.h5' % (model_name, e)) discriminator_model.save_weights(disc_weights_path, overwrite=True) DCGAN_weights_path = os.path.join('../../models/%s/DCGAN_weights_epoch%s.h5' % (model_name, e)) DCGAN_model.save_weights(DCGAN_weights_path, overwrite=True) except KeyboardInterrupt: pass
def train(**kwargs): """ Train standard DCGAN model args: **kwargs (dict) keyword arguments that specify the model hyperparameters """ # Roll out the parameters generator = kwargs["generator"] dset = kwargs["dset"] img_dim = kwargs["img_dim"] nb_epoch = kwargs["nb_epoch"] batch_size = kwargs["batch_size"] n_batch_per_epoch = kwargs["n_batch_per_epoch"] noise_dim = kwargs["noise_dim"] noise_scale = kwargs["noise_scale"] lr_D = kwargs["lr_D"] lr_G = kwargs["lr_G"] opt_D = kwargs["opt_D"] opt_G = kwargs["opt_G"] clamp_lower = kwargs["clamp_lower"] clamp_upper = kwargs["clamp_upper"] image_data_format = kwargs["image_data_format"] save_weights_every_n_epochs = kwargs["save_weights_every_n_epochs"] save_only_last_n_weights = kwargs["save_only_last_n_weights"] visualize_images_every_n_epochs = kwargs["visualize_images_every_n_epochs"] model_name = kwargs["model_name"] epoch_size = n_batch_per_epoch * batch_size print("\nExperiment parameters:") for key in kwargs.keys(): print(key, kwargs[key]) print("\n") # Setup environment (logging directory etc) general_utils.setup_logging(**kwargs) # Load and normalize data X_real_train, X_batch_gen = data_utils.load_image_dataset( dset, img_dim, image_data_format, batch_size) # Get the full real image dimension img_dim = X_real_train.shape[-3:] # Create optimizers opt_G = data_utils.get_optimizer(opt_G, lr_G) opt_D = data_utils.get_optimizer(opt_D, lr_D) ####################### # Load models ####################### noise_dim = (noise_dim, ) if generator == "upsampling": generator_model = models.generator_upsampling(noise_dim, img_dim, dset=dset) else: generator_model = models.generator_deconv(noise_dim, img_dim, batch_size, dset=dset) discriminator_model = models.discriminator(img_dim) DCGAN_model = models.DCGAN(generator_model, discriminator_model, noise_dim, img_dim) ############################ # Compile models ############################ generator_model.compile(loss='mse', optimizer=opt_G) discriminator_model.trainable = False DCGAN_model.compile(loss=models.wasserstein, optimizer=opt_G) discriminator_model.trainable = True discriminator_model.compile(loss=models.wasserstein, optimizer=opt_D) # Global iteration counter for generator updates gen_iterations = 0 disc_losses = [] disc_losses_real = [] disc_losses_gen = [] gen_losses = [] ################# # Start training ################ try: for e in range(nb_epoch): print('--------------------------------------------') print('[{0:%Y/%m/%d %H:%M:%S}] Epoch {1:d}/{2:d}\n'.format( datetime.datetime.now(), e + 1, nb_epoch)) # Initialize progbar and batch counter progbar = generic_utils.Progbar(epoch_size) batch_counter = 0 start = time.time() disc_loss_batch = 0 disc_loss_real_batch = 0 disc_loss_gen_batch = 0 gen_loss_batch = 0 for batch_counter in range(n_batch_per_epoch): if gen_iterations < 25 or gen_iterations % 500 == 0: disc_iterations = 100 else: disc_iterations = kwargs["disc_iterations"] ################################### # 1) Train the critic / discriminator ################################### list_disc_loss_real = [] list_disc_loss_gen = [] for disc_it in range(disc_iterations): # Clip discriminator weights for l in discriminator_model.layers: weights = l.get_weights() weights = [ np.clip(w, clamp_lower, clamp_upper) for w in weights ] l.set_weights(weights) X_real_batch = next( data_utils.gen_batch(X_real_train, X_batch_gen, batch_size)) # Create a batch to feed the discriminator model X_disc_real, X_disc_gen = data_utils.get_disc_batch( X_real_batch, generator_model, batch_counter, batch_size, noise_dim, noise_scale=noise_scale) # Update the discriminator disc_loss_real = discriminator_model.train_on_batch( X_disc_real, -np.ones(X_disc_real.shape[0])) disc_loss_gen = discriminator_model.train_on_batch( X_disc_gen, np.ones(X_disc_gen.shape[0])) list_disc_loss_real.append(disc_loss_real) list_disc_loss_gen.append(disc_loss_gen) ####################### # 2) Train the generator ####################### X_gen = data_utils.sample_noise(noise_scale, batch_size, noise_dim) # Freeze the discriminator discriminator_model.trainable = False gen_loss = DCGAN_model.train_on_batch(X_gen, -np.ones(X_gen.shape[0])) # Unfreeze the discriminator discriminator_model.trainable = True gen_iterations += 1 disc_loss_batch += -np.mean(list_disc_loss_real) - np.mean( list_disc_loss_gen) disc_loss_real_batch += -np.mean(list_disc_loss_real) disc_loss_gen_batch += np.mean(list_disc_loss_gen) gen_loss_batch += -gen_loss progbar.add(batch_size, values=[ ("Loss_D", -np.mean(list_disc_loss_real) - np.mean(list_disc_loss_gen)), ("Loss_D_real", -np.mean(list_disc_loss_real)), ("Loss_D_gen", np.mean(list_disc_loss_gen)), ("Loss_G", -gen_loss) ]) # # Save images for visualization ~2 times per epoch # if batch_counter % (n_batch_per_epoch / 2) == 0: # data_utils.plot_generated_batch(X_real_batch, generator_model, # batch_size, noise_dim, image_data_format) disc_losses.append(disc_loss_batch / n_batch_per_epoch) disc_losses_real.append(disc_loss_real_batch / n_batch_per_epoch) disc_losses_gen.append(disc_loss_gen_batch / n_batch_per_epoch) gen_losses.append(gen_loss_batch / n_batch_per_epoch) # Save images for visualization if (e + 1) % visualize_images_every_n_epochs == 0: data_utils.plot_generated_batch(X_real_batch, generator_model, e, batch_size, noise_dim, image_data_format, model_name) data_utils.plot_losses(disc_losses, disc_losses_real, disc_losses_gen, gen_losses, model_name) # Save model weights (by default, every 5 epochs) data_utils.save_model_weights(generator_model, discriminator_model, DCGAN_model, e, save_weights_every_n_epochs, save_only_last_n_weights, model_name) end = time.time() print('\nEpoch %s/%s END, Time: %s' % (e + 1, nb_epoch, end - start)) start = end except KeyboardInterrupt: pass gen_weights_path = '../../models/%s/generator_latest.h5' % (model_name) print("Saving", gen_weights_path) generator_model.save(gen_weights_path, overwrite=True)