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 の損失を手で計算する方法はありますか?
どんな助けでも大歓迎です:)