【问题标题】:TensorFlow MNIST DCGAN: how to set up the loss function?TensorFlow MNIST DCGAN:如何设置损失函数?
【发布时间】:2017-09-23 04:22:20
【问题描述】:

我想自己在 TensorFlow 中为 MNIST 构建一个 DCGAN。但是,我正在努力找出应该如何为生成器设置损失函数。在Keras DCGAN implementation 中,作者针对这个问题使用了一些“解决方法”:他只构建了 3 个模型。生成器 (G)、判别器 (D) 和第三个,他只是将 G 与 D 组合在一起,同时将 D 的训练能力设置为 false。

这样,他可以用真实图像+生成的图像喂给D来训练D并训练G+D-组合模型,因为D的损失会传播到G,因为D在G+D-中是不可训练的组合模型。

在 TensorFlow 中,我已经构建了 G 和 D。训练 D 相对简单,因为我只需要将一批真实的 MNIST 训练图像与生成的图像结合起来,然后调用训练操作:

session.run(D_train_op,
            feed_dict={x: batch_x, y: batch_y})

本例中的训练操作是二进制cross entropy

tf.losses.softmax_cross_entropy(y, D_out)

...但是当我没有“堆叠”模型时,我将如何设置 G 的损失函数,将“G 和 D”组合为单个第三个模型?

我知道我必须用 G 生成一批图像,将它们输入 D,然后我可以获得 D 的损失......但是,G 的输出形状为(batch_size, 28, 28, 1)。如何手动为 G 设置损失函数?

如果没有“G 和 D”组合模型“解决方法”,我必须将 D 的损失传播到 G 的输出层,其输出形状为 (batch_size, 1)

例如,如果 G 会进行一些分类,那么这并不难弄清楚……但是 G 会输出图像。因此,我不能直接将 D 的损失映射到 G 的输出层。

我是否必须设置第三个结合 G+D 的模型?或者有没有办法手动计算G的损失?

非常感谢任何帮助:)

【问题讨论】:

    标签: tensorflow neural-network conv-neural-network mnist dcgan


    【解决方案1】:

    在生成器步骤训练中,您可以认为网络也涉及判别器。但是要进行反向传播,您只会考虑生成器的权重。 here 有一个很好的解释。

    original paper 中所述,判别器成本为:

    生成器成本为:

    当然,您不需要手动计算。 Tensorflow 已经处理了它。要完成所有过程,您可以执行以下操作:

    G_sample = generator(z)
    D_real = discriminator(X)
    D_fake = discriminator(G_sample)
    
    D_loss = tf.reduce_mean(-tf.log(D_real)-tf.log(1-D_fake))
    G_loss = tf.reduce_mean(-tf.log(D_fake))
    

    其中 D_real、D_fake 和 D_sample 是网络的最后一层。 然后你可以通过标准的方式来实现训练过程:

    D_solver = (tf.train.AdamOptimizer(learning_rate=0.0001,beta1=0.5)
                .minimize(D_loss, var_list=theta_D))
    G_solver = (tf.train.AdamOptimizer(learning_rate=0.0001,beta1=0.5)
                .minimize(G_loss, var_list=theta_G))
    

    只需在会话中运行求解器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2021-07-08
      • 2018-12-20
      • 2018-01-09
      • 2019-01-20
      相关资源
      最近更新 更多