1

TensorFlow でMNIST用の DCGAN を自分で構築したいと考えています。ただし、ジェネレーターの損失関数を設定する方法を見つけるのに苦労しています。Keras DCGAN の実装では、著者はこの問題に対して少しの「回避策」を使用しました。単純に 3 つのモデルを構築しました。ジェネレーター (G)、ディスクリミネーター (D)、そして 3 番目のモデルで、G と D を組み合わせ、そこで D の train-ability を false に設定しました。

このようにして、実際の画像と生成された画像を D に供給して D をトレーニングし、G+D を組み合わせたモデルをトレーニングできます。これは、D が G+D を組み合わせたモデルではトレーニングできないため、D の損失が G に伝播されるためです。

TensorFlow では、既に G と D を構築しています。実際の MNIST トレーニング画像のバッチと生成された画像を組み合わせてトレーニング op ​​を呼び出すだけなので、トレーニング D は比較的単純です。

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

この例のトレーニング op ​​はバイナリクロス エントロピーです。

tf.losses.softmax_cross_entropy(y, D_out)

...しかし、「G と D」を単一の 3 番目のモデルに組み合わせた「スタック」モデルがない場合、G の損失関数をどのように設定すればよいでしょうか?

Gで画像のバッチを生成し、それらをDにフィードする必要があることを知っています.Dの損失を取得できます...ただし、Gの出力は形状(batch_size, 28, 28, 1)です。G の損失関数を手動で設定するにはどうすればよいですか?

このための「G と D」を組み合わせたモデル「回避策」がなければ、出力形状を持つ D の損失を(batch_size, 1)G の出力層に伝播する必要があります。

たとえば、Gが何らかの分類を行う場合、これを理解するのはそれほど難しくありません...しかし、Gは画像を出力します。したがって、D の損失を G の出力層に直接マッピングすることはできません。

G+D を組み合わせた 3 番目のモデルをセットアップする必要がありますか? または、G の損失を手で計算する方法はありますか?

どんな助けでも大歓迎です:)

4

1 に答える 1

5

ジェネレーターステップトレーニングでは、ネットワークにはディスクリミネーターも含まれていると考えることができます。しかし、バックプロパゲーションを行うには、ジェネレーターの重みのみを考慮します。それについての良い説明はここにあります。

元の論文で述べたように、弁別器のコストは次のとおりです。

ここに画像の説明を入力

発電機のコストは次のとおりです。

ここに画像の説明を入力

もちろん、手で計算する必要はありません。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))

セッションでソルバーを実行するだけです。

于 2017-05-12T13:08:39.363 に答える