def cal_real_nearby_grad_penalty(self, real_data):
# WGAN lipschitz-penalty
epsilon = tf.random_uniform(shape=[self.batch_size, 1, 1], minval=0., maxval=1.)
data_diff = get_perturbed_batch(real_data) - real_data
interp_data = real_data + epsilon * data_diff
disc_real_nearby, _ = discriminator(
self.d_net, interp_data, self.conv_hidden_num,
self.normalize_d
)
grad_real_nearby = tf.gradients(disc_real_nearby, [interp_data])[0]
print('The shape of grad_real_nearby: {}'.format(grad_real_nearby.get_shape().as_list()))
grad_real_nearby_flat = tf.reshape(grad_real_nearby, [self.batch_size, -1])
slope = tf.norm(grad_real_nearby_flat, axis=1)
print('The shape of slope: {}'.format(slope.get_shape().as_list()))
grad_penalty = tf.reduce_mean((slope - 1.) ** 2)
return grad_penalty
评论列表
文章目录