GANs in TensorFlow from the Command Line: Creating Your First GitHub Project

In this article I will present the steps to create your first GitHub Project. I will use as an example Generative Adversarial Networks.

By Rubens Zimbres, Data Scientist

I started contributing to GitHub in 2016. Since then my repos have more than 100 different files with Machine Learning, Deep Learning and Natural Language Processing codes I developed while studying Data Science. But they are simple repository of codes, I was not worried about developing a GitHub Project.

In this article I will present the steps to create your first GitHub Project. I will use as an example Generative Adversarial Networks. If you want to learn more about GANs, you can access my PDF presentation here:

As you will see in my project, there is a file where the GAN code is placed and another file with the libraries required to properly run the code (requirements.txt).

The file contains the GAN code itself and the arguments necessary to run the notebook. The arguments are inserted into in this form:

import argparse

parser = argparse.ArgumentParser(description='')
parser.add_argument('--epoch', dest='nb_epoch', type=int, default=5000, help='# of epochs')
parser.add_argument('--learning_rate', dest='lr', type=float, default=0.0001, help='# learning rate')
parser.add_argument('--sample_size', dest='sample_size', type=int, default=60, help='# sample size')
parser.add_argument('--gen_hidden', dest='gen_hidden', type=int, default=80, help='# hidden nodes in generator')
parser.add_argument('--disc_hidden', dest='disc_hidden', type=int, default=80, help='# hidden nodes in discriminator')
parser.add_argument('--your_login', dest='your_login', type=str, default='rubens', help='# your login name')

args = vars(parser.parse_args())

The other file, requirements.txt contains the libraries necessary to run the file in this simple form:


Next, we can develop an interactive function to provide guidelines for the user, as well as to get his/her OS so that the code customizes the folder where the Tensorboard file is stored.

var0 = input("Are you using Linux? [y|n]")

if str(var0)=='n':
        logs_path = 'C:/Users/'+args['your_login']+'/Anaconda3/envs/Scripts/plot_1'
        logs_path = '/home/'+args['your_login']+'/anaconda3/envs/plot_1'

After that we define a function containing our GAN:

def GAN(sample_size):

    def generator(x, reuse=False):
        with tf.variable_scope('Generator', reuse=reuse):
            x = tf.layers.dense(x, units=6 * 6 * 64)
            x = tf.nn.relu(x)
            x = tf.reshape(x, shape=[-1, 6, 6, 64])
            x = tf.layers.conv2d_transpose(x, 32, 4, strides=2)
            x = tf.layers.conv2d_transpose(x, 1, 2, strides=2)
            x = tf.nn.relu(x)
            x = tf.reshape(x, [n,784])
            return x
    def discriminator(x, reuse=False):
        with tf.variable_scope('Discriminator', reuse=reuse):
            x = tf.reshape(x, [n,28,28,1])
            x = tf.layers.conv2d(x, 32, 5)
            x = tf.nn.relu(x)
            x = tf.layers.average_pooling2d(x, 2, 2,padding='same')
            x = tf.layers.conv2d(x, 64, 5,padding='same')
            x = tf.nn.relu(x)
            x = tf.layers.average_pooling2d(x, 8, 8)
            x = tf.contrib.layers.flatten(x)
            x = tf.layers.dense(x, 784)
            x = tf.nn.sigmoid(x)
        return x

... etc. At the end of this article I will provide the link to the full code in my repo.

We also add lines of code to generate our Tensorboard, using tf.summary:


tf.summary.scalar("Generator_Loss", gen_loss)
tf.summary.scalar("Discriminator_Loss", disc_loss)

Images generated by Generator and classified by Discriminator:

tf.summary.image('GenSample', tf.reshape(gen_sample, [-1, 28, 28, 1]), 4)
tf.summary.image('stacked_gan', tf.reshape(stacked_gan, [-1, 28, 28, 1]), 4)

Also, histogram of weights:

for i in range(0,11):
    with tf.name_scope('layer'+str(i)):
        tf.summary.histogram('pesos'+str(i), pesos[i])

Then we open the Tensorflow session to run backpropagation and generate images:

with tf.Session() as sess:
    summary_writer = tf.summary.FileWriter(logs_path, graph=tf.get_default_graph())
    for i in range(1, num_steps+1):
        batch_x, batch_y=next_batch(batch_size, x_train
                                    , x_train_noisy)        
        feed_dict = {real_image_input: batch_x, noise_input: batch_y,
                     disc_target: batch_x, gen_target: batch_y}
        _, _, gl, dl,summary2 =[train_gen, train_disc, gen_loss, disc_loss,summary],
        g =[stacked_gan], feed_dict={noise_input: batch_y})
        h =[gen_sample], feed_dict={noise_input: batch_y})
        summary_writer.add_summary(summary2, i)
        if i % show_steps == 0 or i == 1:
            print('Epoch %i: Generator Loss: %f, Discriminator Loss: %f' % (i, gl, dl))


if __name__ == '__main__':

To run the code, you must run (in Anaconda folder):

$ git clone

$ cd GAN-Project-2018

$ conda install --yes --file requirements.txt

$ python --epoch=4000 --learning_rate=0.0001 –your_login=rubens


--epoch: default=5000
--learning_rate: default=0.0001
--sample_size: default=60
--gen_hidden: # hidden nodes in generator: default=80
--disc_hidden: # hidden nodes in discriminator: default=80
--your_login: your login in your OS: default:rubens

The arguments provided in this line of code will customize your GAN like this:

num_steps = args['nb_epoch']
image_dim = 784 
gen_hidden_dim = args['gen_hidden']
disc_hidden_dim = args['disc_hidden']

This is the output you are expected to have:

Output image

Tensorboard will start AFTER you close the pop-up (GAN output with MNIST digits)

After closing the MNIST pop-up window, the code starts the Tensorboard server with this following line of code at

os.system('tensorboard –logdir='+logs_path)

You then access the URL provided by Tensorboard and access training details in your browser, like scalars (training losses), graph (GAN structure), images (generated and classified) and histograms (of weights). See the following pictures.

To access details of this project, access:




Bio: Rubens Zimbres, PhD, is a strategist and data scientist with over 23 years of experience in customer service, management and financial planning, having worked with crisis management, as CEO and Data Scientist in the areas of strategic planning and restructuring, physical and digital marketing, social networks analysis, personnel management, customer database analysis. He has 13 years of Market Research expertise and 10 years of data analysis experience.