如果我的 GAN 鉴别器损失变为 0 是不是很糟糕?

Is it bad if my GAN discriminator loss goes to 0?

一直在训练我的 Pix2Pix GAN,鉴别器损失在第 20 个纪元左右开始变为 0。从第 30 个纪元开始,它一直保持在 0。

然而生成器损耗一直在下降。在开始的前几个 epoch 左右,生成器损失在 50 - 60 之间。在第 100 个 epoch 左右,生成器损失约为 4 - 5。然后从第 150 到第 350 个 epoch,生成器损失在 1 - 3 之间徘徊。

那么判别器损失为0是不是很糟糕?我该如何解决?

基本上,您不希望 Descriminator 损失变为零,因为这意味着 Descriminator 做得太好(最重要的是,Generator 做得太差),即它可以轻松区分假数据和真实数据之间的差异(即生成器的创作与真实数据不够接近)。

总而言之,以这种方式定义描述器的损失很重要,因为我们确实希望描述器尝试减少这种损失,但整个 GAN 系统的最终目标是平衡损失。因此,如果一次损失变为零,则为失败模式(不再进行学习)。

为避免这种情况,您必须确保最后一个 Descriminator 层不是 Sigmoid 层,并且您的损失不限于 [0, 1] 之间。您可以尝试使用 BCE 图层或类似的东西。

对我来说,GAN 网络是移动网络,对于大多数网络关于训练和损失值的行为,先前的答案是正确的,确切的小损失评估值的数量不能保证结果。

损失评估值仅与训练步骤、目标估计和学习权重进行比较,看到一些样本对于损失数计算非常大,但分类任务有效。

此外,一些输出是二进制数字输出或序列,因为之前的答案告诉您不使用 sigmoids 函数,但 softmax 或激活函数是您可以在这里发挥的更多作用。

答案:当损失评估值变为0或大于5时,这还不错,但它与您select函数的方式有关。

[二进制序列样本]:

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))

[输出]: