dan*_*451 1 neural-network mnist conv-neural-network tensorflow dcgan
我想自己在 TensorFlow 中为 MNIST构建一个DCGAN。但是,我正在努力找出应该如何为生成器设置损失函数。在Keras DCGAN 实现中,作者对这个问题使用了一点“解决方法”:他简单地构建了 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})
Run Code Online (Sandbox Code Playgroud)
本例中的训练操作是一个二元交叉熵:
tf.losses.softmax_cross_entropy(y, D_out)
Run Code Online (Sandbox Code Playgroud)
...但是当我没有“堆叠”模型,将“G 和 D”组合到单个第三个模型时,我将如何为 G 设置损失函数?
我知道我必须用 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 的损失?
任何帮助都非常感谢:)
小智 5
在生成器步骤训练中,您可以认为网络也涉及鉴别器。但是要进行反向传播,您将只考虑生成器的权重。一个很好的解释可以在这里找到。
如原始论文所述,鉴别器成本为:
发电机成本为:
当然,您不需要手动计算。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))
Run Code Online (Sandbox Code Playgroud)
其中 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))
Run Code Online (Sandbox Code Playgroud)
只需在会话中运行求解器即可。
| 归档时间: |
|
| 查看次数: |
1460 次 |
| 最近记录: |