我想自己在 TensorFlow 中为 MNIST 构建一个DCGAN。但是,我正在努力找出应该如何为生成器设置损失函数。在Keras DCGAN 实现中,作者针对这个问题使用了一些“解决方法”:他只是构建了 3 个模型。生成器 (G)、判别器 (D) 和第三个,他只是将 G 与 D 组合在一起,同时将 D 的训练能力设置为 false。
这样,他可以用真实图像 + 生成的图像来训练 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})
本例中的训练操作是二元交叉熵:
tf.losses.softmax_cross_entropy(y, D_out)
...但是当我没有“堆叠”模型时,我将如何为 G 设置损失函数,将“G 和 D”结合到单个第三模型?
我知道我必须用 G 生成一批图像,将它们输入 D,然后我可以获得 D 的损失......但是,G 的输出是 shape (batch_size, 28, 28, 1)
。我将如何手动为 G 设置损失函数?
如果没有“G 和 D”组合模型“解决方法”,我必须将 D 的损失传播到(batch_size, 1)
G 的输出层。
例如,如果 G 会做一些分类,这并不难弄清楚……但 G 会输出图像。因此,我不能直接将 D 的损失映射到 G 的输出层。
我必须建立第三个结合 G+D 的模型吗?或者有没有办法手动计算 G 的损失?
非常感谢任何帮助:)