2017-04-25 135 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)) 

而就在會話中運行的求解器。