def train_input_fn(): with tf.device('/cpu:0'): images, _, _ = data_provider.provide_data('train', batch_size, dataset_dir, num_threads=num_threads) noise = tf.random_normal([batch_size, noise_dims]) return noise, images
def image2image(): # Set up the input pipeline. input_image, target_image = data_provider.provide_data(FLAGS.batch_size) # Build the generator and discriminator. gan_model = tfgan.gan_model( generator_fn=nets.generator, # you define discriminator_fn=nets.discriminator, # you define real_data=target_image, generator_inputs=input_image) # Build the GAN loss and standard pixel loss. gan_loss = tfgan.gan_loss( gan_model, generator_loss_fn=tfgan.losses.least_squares_generator_loss, discriminator_loss_fn=tfgan.losses.least_squares_discriminator_loss) l1_pixel_loss = tf.norm(gan_model.real_data - gan_model.generated_data, ord=1) # Modify the loss tuple to include the pixel loss. gan_loss = tfgan.losses.combine_adversarial_loss( gan_loss, gan_model, l1_pixel_loss, weight_factor=FLAGS.weight_factor)
def prepare_data(): MNIST_DATA_DIR = '/tmp/mnist-data' if not tf.gfile.Exists(MNIST_DATA_DIR): tf.gfile.MakeDirs(MNIST_DATA_DIR) download_and_convert_mnist.run(MNIST_DATA_DIR) # FIXME why reset graph here? tf.reset_default_graph() # Define our input pipeline. Pin it to the CPU so that the GPU can be reserved # for forward and backwards propogation. batch_size = 32 with tf.device('/cpu:0'): # data provider FIXME why returning three fields? real_images, _, _ = data_provider.provide_data('train', batch_size, MNIST_DATA_DIR) # Sanity check that we're getting images. check_real_digits = tfgan.eval.image_reshaper(real_images[:20, ...], num_cols=10) visualize_digits(check_real_digits) # FIXME is this a tensor or an iterator? return real_images
def train_input_fn(): with tf.device('/cpu:0'): real_images, _, _ = data_provider.provide_data( 'train', batch_size, MNIST_DATA_DIR) noise = tf.random_normal([batch_size, noise_dims]) return noise, real_images
# In[5]: MNIST_DATA_DIR = '/tmp/mnist-data' if not tf.gfile.Exists(MNIST_DATA_DIR): tf.gfile.MakeDirs(MNIST_DATA_DIR) download_and_convert_mnist.run(MNIST_DATA_DIR) tf.reset_default_graph() # Define our input pipeline. Pin it to the CPU so that the GPU can be reserved # for forward and backwards propogation. batch_size = 32 with tf.device('/cpu:0'): real_images, _, _ = data_provider.provide_data('train', batch_size, MNIST_DATA_DIR) # Sanity check that we're getting images. check_real_digits = tfgan.eval.image_reshaper(real_images[:20, ...], num_cols=10) visualize_digits(check_real_digits) def generator_fn(noise, weight_decay=2.5e-5, is_training=True): """Simple generator to produce MNIST images. Args: noise: A single Tensor representing noise. weight_decay: The value of the l2 weight decay. is_training: If `True`, batch norm uses batch statistics. If `False`, batch norm uses the exponential moving average collected from population
def train_input_fn(): with tf.device('/cpu:0'): images, _, _ = data_provider.provide_data( 'train', batch_size, dataset_dir, num_threads=num_threads) noise = tf.random_normal([batch_size, noise_dims]) return noise, images
MNIST_DATA_DIR = '/tmp/mnist-data' if not tf.gfile.Exists(MNIST_DATA_DIR): tf.gfile.MakeDirs(MNIST_DATA_DIR) download_and_convert_mnist.run(MNIST_DATA_DIR) tf.reset_default_graph() # Define our input pipeline. Pin it to the CPU so that the GPU can be reserved # for forward and backwards propogation. batch_size = 32 with tf.device('/cpu:0'): real_images, _, _ = data_provider.provide_data( 'train', batch_size, MNIST_DATA_DIR) # Sanity check that we're getting images. check_real_digits = tfgan.eval.image_reshaper(real_images[:20,...], num_cols=10) visualize_digits(check_real_digits) def infogan_generator(inputs, categorical_dim, weight_decay=2.5e-5, is_training=True): """InfoGAN discriminator network on MNIST digits. Based on a paper https://arxiv.org/abs/1606.03657 and their code https://github.com/openai/InfoGAN. Args: inputs: A 3-tuple of Tensors (unstructured_noise, categorical structured
DATA_DIR = "assets/data/" RESULT_DIR = "assets/results/" # short cuts tfgan = tf.contrib.gan slim = tf.contrib.slim if not tf.gfile.Exists(DATA_DIR): # check if data directory already exists tf.gfile.MakeDirs(DATA_DIR) download_and_convert_mnist.run(DATA_DIR) # download data if missing # input pipeline batch_size = 32 with tf.device('/cpu:0'): # pin it to the cpu to free up gpu for propagation images, one_hot_labels, _ = data_provider.provide_data( 'train', batch_size, DATA_DIR) # Sanity check that we're getting images. imgs_to_visualize = tfgan.eval.image_reshaper(images[:20, ...], num_cols=10) visualizer.pre_train_image(imgs_to_visualize, save=False) noise_dims = 64 conditional_gan_model = tfgan.gan_model(generator_fn=tf_nets.generator, discriminator_fn=tf_nets.discriminator, real_data=images, generator_inputs=(tf.random_normal( [batch_size, noise_dims]), one_hot_labels)) # Sanity check that currently generated images are garbage. cond_generated_data_to_visualize = tfgan.eval.image_reshaper(
def train(is_train): if not tf.gfile.Exists(MNIST_DATA_DIR): tf.gfile.MakeDirs(MNIST_DATA_DIR) #download_and_convert_mnist.run(MNIST_DATA_DIR) tf.reset_default_graph() # Define our input pipeline. Pin it to the CPU so that the GPU can be reserved # for forward and backwards propogation. batch_size = 32 with tf.device('/cpu:0'): real_images, _, _ = data_provider.provide_data( 'train', batch_size, MNIST_DATA_DIR) # Sanity check that we're getting images. #check_real_digits = tfgan.eval.image_reshaper( # real_images[:20,...], num_cols=10) #print('visualize_digits') #visualize_digits(check_real_digits) #plt.show() gan_model = tfgan.gan_model( generator_fn, discriminator_fn, real_data=real_images, generator_inputs=tf.random_normal([batch_size, noise_dims])) improved_wgan_loss = tfgan.gan_loss( gan_model, # We make the loss explicit for demonstration, even though the default is # Wasserstein loss. generator_loss_fn=tfgan.losses.wasserstein_generator_loss, discriminator_loss_fn=tfgan.losses.wasserstein_discriminator_loss, gradient_penalty_weight=1.0) # Sanity check that we can evaluate our losses. print("Sanity check that we can evaluate our losses") for gan_loss, name in [(improved_wgan_loss, 'improved wgan loss')]: evaluate_tfgan_loss(gan_loss, name) #generator_optimizer = tf.train.AdamOptimizer(0.001, beta1=0.5) #discriminator_optimizer = tf.train.AdamOptimizer(0.0001, beta1=0.5) generator_optimizer = tf.train.RMSPropOptimizer(0.001) discriminator_optimizer = tf.train.RMSPropOptimizer(0.0001) gan_train_ops = tfgan.gan_train_ops( gan_model, improved_wgan_loss, generator_optimizer, discriminator_optimizer) # ### Evaluation num_images_to_eval = 500 MNIST_CLASSIFIER_FROZEN_GRAPH = os.path.join( RESEARCH_FOLDER, 'gan/mnist/data/classify_mnist_graph_def.pb') # For variables to load, use the same variable scope as in the train job. with tf.variable_scope('Generator', reuse=True): eval_images = gan_model.generator_fn( tf.random_normal([num_images_to_eval, noise_dims]), is_training=False) # Calculate Inception score. eval_score = util.mnist_score(eval_images, MNIST_CLASSIFIER_FROZEN_GRAPH) # Calculate Frechet Inception distance. with tf.device('/cpu:0'): real_images, _, _ = data_provider.provide_data( 'train', num_images_to_eval, MNIST_DATA_DIR) frechet_distance = util.mnist_frechet_distance( real_images, eval_images, MNIST_CLASSIFIER_FROZEN_GRAPH) # Reshape eval images for viewing. generated_data_to_visualize = tfgan.eval.image_reshaper( eval_images[:20,...], num_cols=10) # This code block should take about **1 minute** to run on a GPU kernel, and about **8 minutes** on CPU. train_step_fn = tfgan.get_sequential_train_steps() global_step = tf.train.get_or_create_global_step() loss_values, mnist_scores, frechet_distances = [], [], [] tf.summary.scalar('dis_loss', gan_loss.discriminator_loss) tf.summary.scalar('gen_loss', gan_loss.generator_loss) merged = tf.summary.merge_all() saver = tf.train.Saver() saver_hook = tf.train.CheckpointSaverHook( checkpoint_dir= "./models", save_steps=1000, saver=saver) print("Graph trainable nodes:") for v in tf.trainable_variables(): print (v.name) with tf.train.SingularMonitoredSession(hooks=[saver_hook], checkpoint_dir="./models") as sess: start_time = time.time() train_writer = tf.summary.FileWriter("./summary", sess.graph) if is_train: for i in xrange(2000): cur_loss, _ = train_step_fn( sess, gan_train_ops, global_step, train_step_kwargs={}) loss_values.append((i, cur_loss)) if i % 10 == 0: merged_val = sess.run(merged) train_writer.add_summary(merged_val, i) print("Step:{}".format(i)) mnist_score, f_distance, digits_np = sess.run( [eval_score, frechet_distance, generated_data_to_visualize]) mnist_scores.append((i, mnist_score)) frechet_distances.append((i, f_distance)) print('Current loss: %f' % cur_loss) print('Current MNIST score: %f' % mnist_scores[-1][1]) print('Current Frechet distance: %f' % frechet_distances[-1][1]) visualize_training_generator(i, start_time, digits_np) else: #generate from trained model generated = sess.run(eval_images) print("generated[0] shape:{}".format(generated[0].shape)) plt.imshow(np.squeeze(generated[0]), cmap='gray') plt.show()