2017-04-25 129 views
0

我想通过自己在TensorFlow搭建一个MNIST DCGAN。但是,我正在努力研究如何为发生器设置损失函数。在Keras DCGAN implementation中,作者为这个问题使用了一个“解决方法”:他只是建立了3个模型。发电机(G),鉴别器(D)和第三个,他只是将G与D结合在一起,同时将D的训练能力设置为假。TensorFlow MNIST DCGAN:如何设置丢失功能?

这样,他可以向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) 

...但我怎么会设置为G中的损失函数,当我没有“堆叠”模式,“G和d”相结合,单一的,第三种模式?

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

没有“G和d” -combined模式“的解决方法”对于这一点,我必须传播d的损耗,其具有(batch_size, 1)输出形状G.

的输出层

若G会例如做一些分类,这不会很难弄清楚......但是G输出图像。因此,我不能直接d的损失映射到G.

的输出层是否必须成立第三模型组合G + d?或者有什么方法可以手动计算G的损失?

任何帮助,高度赞赏:)

回答

3

发电机步训练,你能想到的是,网络涉及鉴别了。但是要做反向传播,你只会考虑发生器的权重。一个很好的解释是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)) 

而就在会话中运行的求解器。