当我们使用wgan-gp损失训练gan时,需要根据评论者的输入对评论者的输出的梯度范数进行惩罚。
在原始论文和此keras工具(https://github.com/eriklindernoren/Keras-GAN/blob/master/wgan_gp/wgan_gp.py)中,生成器仅输出生成的图像,因此渐变为:
gradients = K.gradients(y_pred, averaged_samples)[0]
gradients_sqr = K.square(gradients)
gradients_sqr_sum = K.sum(gradients_sqr,axis=np.arange(1,len(gradients_sqr.shape)))
其中averaged_samples是image_real和image_fake的随机均匀插值,而gradients_sqr_sum的大小为(batch_size,),这是输出相对于输入的总和梯度。
如果我希望生成器输出生成的图像以及对象类别(例如,数字图像以及该图像包含的数字位数),则梯度范数应该是评论者对其所有输入(img和对象)的输出类别),对吗?
如果是,则代码应为
gradients = K.gradients(y_pred, [averaged_samples,averaged_class])
gradients_sqr_sum =tf.constant(np.zeros(batch_size))
for i in range(2):
gradients_sqr = K.square(gradients[i])
gradients_sqr_sum += K.sum(gradients_sqr,axis=np.arange(1,len(gradients_sqr.shape)))
这样,gradients_sqr_sum仍然是输出相对于所有输入的总和梯度。我说得对吗?