我想在TensorFlow中自己为MNIST构建一个DCGAN。但是,我很难找到如何设置发电机的损耗功能。在Keras DCGAN implementation中,作者使用了一些"解决方法"对于这个问题:他简单地建造了3个模型。发生器(G),鉴别器(D)和第三个,他只是将G与D组合,同时将D的训练能力设置为假。
这样,他可以用真实图像+生成的图像为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" - 组合模型"解决方法"为此,我必须将输出形状为(batch_size, 1)
的D的丢失传播到G的输出层。
例如,如果G会进行某种分类,那么难以理解......但G输出图像。因此,我不能直接将D的丢失映射到G的输出层。
我是否必须设置组合G + D的第三个模型?或者有没有办法手动计算G的损失?
非常感谢任何帮助:)
答案 0 :(得分:4)
在生成器步骤训练中,您可以认为网络也涉及鉴别器。但要进行反向传播,您只需考虑发电机重量。找到了一个很好的解释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))
只需在会话中运行解算器。