Python 在TensorFlow中使用LSTM-CGAN生成MNIST数

Python 在TensorFlow中使用LSTM-CGAN生成MNIST数,python,tensorflow,neural-network,lstm,recurrent-neural-network,Python,Tensorflow,Neural Network,Lstm,Recurrent Neural Network,受此启发,我正在尝试构建一个条件GAN,它将使用LSTM生成MNIST编号。我希望我使用的架构与下图中相同(除了双向RNN in鉴别器,摘自): 当我运行这个模型时,我得到了非常奇怪的结果。此图显示了我的模型在每个历元后生成的编号3。它应该看起来更像。真糟糕 我的鉴别器的丢失网络下降速度非常快,接近于零。然而,my发电机的损耗在某个固定点附近振荡(可能缓慢发散)。我真的不知道发生了什么事。以下是我的代码(完整代码)中最重要的部分: 我的模型很可能有问题。有人能帮我使发电机网络融合吗?您可以做

受此启发,我正在尝试构建一个条件GAN,它将使用LSTM生成MNIST编号。我希望我使用的架构与下图中相同(除了双向RNN in鉴别器,摘自):

当我运行这个模型时,我得到了非常奇怪的结果。此图显示了我的模型在每个历元后生成的编号3。它应该看起来更像。真糟糕

我的鉴别器的丢失网络下降速度非常快,接近于零。然而,my发电机的损耗在某个固定点附近振荡(可能缓慢发散)。我真的不知道发生了什么事。以下是我的代码(完整代码)中最重要的部分:


我的模型很可能有问题。有人能帮我使发电机网络融合吗?

您可以做一些事情来改进您的网络架构和培训阶段

  • 从发生器和鉴别器上拆下
    tf.nn.sigmoid(logit)
    。只返回
    pred
  • 使用数值稳定的函数计算损失函数,并修复损失函数:

    D_损失=-tf.reduce_均值(tf.log(D_real)+tf.log(1.-D_fake)) G_损失=-tf.reduce_平均值(tf.log(D_伪))

  • 应该是:

    D_loss_real = tf.nn.sigmoid_cross_entropy_with_logits(
                  logits=D_real,
                  labels=tf.ones_like(D_real))
    D_loss_fake = tf.nn.sigmoid_cross_entropy_with_logits(
                  logits=D_fake,
                  labels=tf.zeros_like(D_fake))
    
    D_loss = -tf.reduce_mean(D_loss_real + D_loss_fake)
    G_loss = -tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
                  logits=D_real,
                  labels=tf.ones_like(D_real)))
    
    一旦你修正了损耗并使用了数值稳定的函数,事情就会变得更好。此外,根据经验,如果损失中有太多噪音,则降低学习率(ADAM的默认lr在训练GANs时通常过高)。
    希望它有帮助

    可能有用,即使它们是为简单的GANs编写的。您的问题是鉴别器的学习速度如此之快,它确实允许生成器进行改进。这是一个普遍的问题。如果您的代码没有明显的错误,那么该链接将帮助您解决问题。我想知道生成器是否需要更多信息来创建有意义的数字?它似乎在每一行输出非常相似的东西?@JacquesKvam在某些情况下,它比上面的图片要糟糕得多。生成器仅返回垂直直线,顶部仅有几行噪声。
    D_loss_real = tf.nn.sigmoid_cross_entropy_with_logits(
                  logits=D_real,
                  labels=tf.ones_like(D_real))
    D_loss_fake = tf.nn.sigmoid_cross_entropy_with_logits(
                  logits=D_fake,
                  labels=tf.zeros_like(D_fake))
    
    D_loss = -tf.reduce_mean(D_loss_real + D_loss_fake)
    G_loss = -tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
                  logits=D_real,
                  labels=tf.ones_like(D_real)))