I have been training a GAN in the cloud for some time now. I use Google's free credit. My laptop with a CPU doesn't seem to be up to the task.

The image I want to generate is this.
[![enter image description here][1]][1]

Even though the number of epochs is about 15000 I don't get anything close to the original. 

This is the main code. I don't claim to fully understand the deep layers. It took a few days to even write this code. The rest of the code is boilerplate to train. 

There is no compilation error and I look at the images using TensorBoard.

The output from the generator is (1024,1024) images. Should this be the same as my original which is a (299,299) images.

Should I calculate using formulas how each layer transforms the image to understand it better ?

How do I fix this ?

 X = tf.placeholder(tf.float32, shape=[None, 299, 299, 1], name='X')
 
 
 Z = tf.placeholder(dtype=tf.float32,
 shape=(None, 100),
 name='Z')
 is_training = tf.placeholder(dtype=tf.bool,name='is_training')
 
 keep_prob = tf.placeholder(dtype=tf.float32, name='keep_prob')
 keep_prob_value = 0.6
 
 
 def generator(z,reuse=False, keep_prob=keep_prob_value,is_training=is_training):
 with tf.variable_scope('generator',reuse=reuse):
 linear = tf.layers.dense(z, 1024 * 8 * 8)
 linear = tf.contrib.layers.batch_norm(linear, is_training=is_training,decay=0.88)
 conv = tf.reshape(linear, (-1, 128, 128, 8))
 out = tf.layers.conv2d_transpose(conv, 64,kernel_size=4,strides=2, padding='SAME')
 out = tf.layers.dropout(out, keep_prob)
 out = tf.contrib.layers.batch_norm(out, is_training=is_training,decay=0.88)
 out = tf.nn.leaky_relu(out)
 out = tf.layers.conv2d_transpose(out, 32,kernel_size=4,strides=2, padding='SAME')
 out = tf.layers.dropout(out, keep_prob)
 out = tf.contrib.layers.batch_norm(out, is_training=is_training,decay=0.88)
 out = tf.layers.conv2d_transpose(out, 1,kernel_size=4,strides=2, padding='SAME')
 out = tf.layers.dropout(out, keep_prob)
 out = tf.contrib.layers.batch_norm(out, is_training=is_training,decay=0.88)
 print( out.get_shape())
 out = tf.nn.leaky_relu(out)
 tf.nn.tanh(out)
 return out
 
 
 def discriminator(x,reuse=False, keep_prob=keep_prob_value):
 with tf.variable_scope('discriminator',reuse=reuse):
 out = tf.layers.conv2d(x, filters=32, kernel_size=[3, 3], padding='SAME')
 out = tf.layers.dropout(out, keep_prob)
 out = tf.nn.leaky_relu(out)
 out = tf.layers.max_pooling2d(out, pool_size=[2, 2],padding='SAME', strides=2)
 out = tf.layers.conv2d(out, filters=64, kernel_size=[3, 3], padding='SAME')
 out = tf.layers.dropout(out, keep_prob)
 out = tf.nn.leaky_relu(out)
 out = tf.layers.max_pooling2d(out, pool_size=[2, 2],padding='SAME', strides=2)
 out = tf.layers.dense(out, units=256, activation=tf.nn.leaky_relu)
 out = tf.layers.dense(out, units=1, activation=tf.nn.sigmoid)
 return out
 
 
 GeneratedImage = generator(Z)
 
 DxL = discriminator(X)
 DgL = discriminator(GeneratedImage, reuse=True)

 [1]: https://i.sstatic.net/5V9io.png