如果我的 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))
[输出]:
一直在训练我的 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))
[输出]: