2017-04-25 17 views
0

TensorFlowで自分でMNIST用にDCGANを作りたいと思います。しかし、私は発電機の損失機能をどのように設定すべきかを見つけるのに苦労しています。 Keras DCGAN implementationでは、著者はこの問題に対して少し「回避策」を使用しました。彼は単純に3つのモデルを構築しました。ジェネレータ(G)、弁別子(D)、そして第3のもの。ここでGをDと組み合わせただけで、Dの列車能力はFalseに設定されます。TensorFlow MNIST DCGAN:損失関数の設定方法は?

このようにして、DはG + Dで訓練可能ではないので、Dの損失はGに伝播するので、Dを実際の画像+生成された画像でDに訓練し、D +組み合わされたモデル。

TensorFlowでは、私はすでにGとDを構築しました。私はちょうど発生したもので、実際のMNISTの訓練画像のバッチを組み合わせ、研修OPを呼び出す必要があるためトレーニングDは、比較的簡単です:

session.run(D_train_op, 
      feed_dict={x: batch_x, y: batch_y}) 

この例では、トレーニングopがバイナリcross entropyです:

tf.losses.softmax_cross_entropy(y, D_out) 

... "GとD"を1つ、3つ目のモデルに組み合わせた "積み重ね"モデルがないと、Gの損失関数をどのように設定するのですか?

私はGで画像のバッチを生成してDに送り、Dの損失を得ることができると知っています...しかし、Gの出力は形(batch_size, 28, 28, 1)です。私は手でGの損失関数をどのように設定するのですか? GはならばG.

の出力層に(batch_size, 1)の出力形状を有する

このため、「G及びD」-combinedモデル「回避策」がなければ、私はDの損失を伝播しなければなりません、例えば、いくつかの分類を行うと、これは分かりにくいですが、Gは画像を出力します。したがって、Dの損失をGの出力レイヤーに直接マッピングすることはできません。

G + Dを組み合わせた3番目のモデルを設定する必要はありますか?それとも手でGの損失を計算する方法はありますか?

すべてのヘルプは高く評価される:)

答えて

3

発電のステップのトレーニングでは、ネットワークがあまりにも弁別に関与することを考えることができます。しかし、逆伝播を行うには、ジェネレータの重みしか考慮しません。その良い説明はhereです。

original paperで述べたように、弁別コストは次のとおりです。

enter image description here

と発電コストは次のとおりです。もちろん

enter image description here

、あなたはでそれを計算する必要はありません。ハンド。 Tensorflowはすでにそれを処理しています。すべてのプロセスを実行するには、次のように実装できます。D_real、D_fakeとD_sampleがネットワークの最後の層である

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_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)) 

そして、ちょうどセッションでソルバーを実行します。

関連する問題