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

时间:2017-04-25 23:54:33

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

我想在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的损失?

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:4)

在生成器步骤训练中,您可以认为网络也涉及鉴别器。但要进行反向传播,您只需考虑发电机重量。找到了一个很好的解释here

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

enter image description here

发电机成本是:

enter image description here

当然,您不需要手动计算。 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))

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