一直在训练我的Pix2Pix GAN,鉴别器损失在第20个epoch左右开始趋于0。然后,从大约30个历元开始,它始终保持在0。
发电机损耗不断减小。在开始的几个时期,发电机的损耗在50 - 60之间。在第100 epoch左右,发电机损耗约为4 - 5。从第150 ~ 350 epoch,发电机损耗在1 ~ 3之间徘徊。
那么鉴别器损失趋于0是件坏事吗?我该怎么解决呢?
基本上,你不希望discriminator损失为零,因为这意味着discriminator做得太好了(最重要的是,Generator做得太糟糕了),也就是说,它可以很容易地区分假数据和真实数据(即生成器的创建不够接近真实数据)。
综上所述,以这种方式定义鉴别器的损失是很重要的,因为我们确实希望鉴别器尝试减少这种损失,但整个GAN系统的最终目标是使损失平衡。因此,如果一个损失变为零,则为失败模式(不再发生学习)。
为了避免这种情况,你必须确保你的最后一个鉴别符层不是一个Sigmoid层,并且你的损失不限制在[0,1]之间。你可以尝试使用BCE
层或类似的东西。
对我来说,GAN网络是移动网络,大多数网络的行为都是关于训练和损失值的,前面的答案是正确的,精确的小损失评估值的数量并不能保证结果。
损失评估值仅与训练步骤,目标估计和学习权重进行比较,看到一些样本对于损失数计算非常大,但分类任务是有效的。
此外,一些输出是二进制数输出或序列,因为前面的答案告诉不使用sigmoids函数,但softmax或激活函数在这里可以发挥更多的作用。
答:损失评估值趋近于0或大于5时并不坏,关键在于如何选择函数。
[示例二进制序列]:
group_1_ShoryuKen_Left = tf.constant([ 0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0 ], shape=(1, 1, 1, 48))
group_1_ShoryuKen_Right = tf.constant([ 0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0 ], shape=(1, 1, 1, 48))
group_2_HadoKen_Left = tf.constant([ 0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0 ], shape=(1, 1, 1, 48))
group_2_HadoKen_Right = tf.constant([ 0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0 ], shape=(1, 1, 1, 48))
group_2_Heriken_kick_Left = tf.constant([ 0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0 ], shape=(1, 1, 1, 48))
group_2_Heriken_kick_Right = tf.constant([ 0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0 ], shape=(1, 1, 1, 48))