'D and G play two-player minimax game with value function V(G,D)
min_G max _D V(D, G) = IE_{x ~ p_data} [log D(x)] + IE_{z ~ p_fake} [log (1 - D(G(z)))]
Args:
logits_real (tf.Tensor): discrim logits from real samples
logits_fake (tf.Tensor): discrim logits from fake samples produced by generator'

def build_losses(self, logits_real, logits_fake):

    with tf.name_scope('GAN_loss'):
        score_real = tf.sigmoid(logits_real)
        score_fake = tf.sigmoid(logits_fake)
        tf.summary.histogram('score-real', score_real)
        tf.summary.histogram('score-fake', score_fake)
        with tf.name_scope('discrim'):
            d_loss_pos = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits_real, labels=tf.ones_like(logits_real)), name='loss_real')
            d_loss_neg = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits_fake, labels=tf.zeros_like(logits_fake)), name='loss_fake')
            d_pos_acc = tf.reduce_mean(tf.cast((score_real > 0.5), tf.float32), name='accuracy_real')
            d_neg_acc = tf.reduce_mean(tf.cast((score_fake < 0.5), tf.float32), name='accuracy_fake')
            d_accuracy = tf.add((0.5 * d_pos_acc), (0.5 * d_neg_acc), name='accuracy')
            self.d_loss = tf.add((0.5 * d_loss_pos), (0.5 * d_loss_neg), name='loss')
        with tf.name_scope('gen'):
            self.g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits_fake, labels=tf.ones_like(logits_fake)), name='loss')
            g_accuracy = tf.reduce_mean(tf.cast((score_fake > 0.5), tf.float32), name='accuracy')
        add_moving_summary(self.g_loss, self.d_loss, d_accuracy, g_accuracy)
