TensorFlow MNIST DCGAN:如何设置损失函数?

TensorFlow MNIST DCGAN: how to set up the loss function?

我想建一个DCGAN for MNIST by myself in TensorFlow. However, I'm struggling to find out how I should set up the loss function for the generator. In a Keras DCGAN implementation作者用了一点"workaround"来解决这个问题:他只建了3个模型。生成器 (G)、鉴别器 (D) 和第三个,他只是将 G 与 D 组合在一起,同时将 D 的可训练能力设置为 false。

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

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

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

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

tf.losses.softmax_cross_entropy(y, D_out)

...但是当我没有 "stacked" 模型,将 "G and D" 组合到单个第三个模型时,我将如何设置 G 的损失函数?

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

如果没有 "G and D"-组合模型 "workaround",我必须将输出形状为 (batch_size, 1) 的 D 的损失传播到 G 的输出层。

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

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

非常感谢任何帮助:)

在生成器步骤训练中,你可以认为网络也涉及鉴别器。但是要进行反向传播,您将只考虑生成器权重。 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))

并且只有 运行 个会话中的求解器。