PythonでGANを用いた画像生成プログラムを作っています。
教師データとしてMNISTデータセットを用い、偽の手書き数字画像を生成するのが目標です。
画像を生成するGeneratorは、ランダムなノイズベクトルから、UpSampling2DレイヤーまたはDeconvolution2D(Conv2DTranspose)レイヤー、Convolution2Dレイヤー、活性化関数(主にRelu)を6層ほど(何度か層を変えて試してみていますが拡大縮小したデータサイズを合わせるためにだいたい6層ほどでやっています)経て画像として出力します。
一方、本物の画像と生成画像を判別するDiscriminatorは、入力画像を数層のConvolution2Dレイヤーと活性化関数へ渡し、Dense(Affine)レイヤーを5層ほど経て判別結果を出力します。
本物・偽物を1,0で表現し、0~1の範囲のDiscriminatorの出力との差を使って損失関数を定義しています。(Kerasではbinary_crossentropyを用いています)
しかし何度実験してみても出来上がった画像はノイズのようなものばかりです。
(以下がいくつかの生成画像です,
上5つが外部ライブラリに頼らずに作ったもの, 下5つがKerasを用いて作ったもの)
===============================================
これまでに試してみたこととしては、
- 様々な組み合わせのハイパーパラメーターで学習する
- GeneratorとDiscriminatorのバランスを取る(それぞれの精度を加味しながら)
- Relu以外の活性化関数を使ってみる
- Batch Normalizationを使う
- レイヤーの組み合わせも様々に試す
- 画像分類などは問題なく作れる
インターネットで手当たり次第に調べたり、書籍で参考になりそうな情報を探したり、手を尽くしましたがなぜ全くうまくいかないのかわかりません。問題がレイヤーの組み方なのか、何か決定的に重要な処理を飛ばしてしまっているのか、損失関数などの評価の仕方が悪いのかも見当もつきません。
なにか見落としているポイントなどがありますでしょうか?
解決しました

回答1件
あなたの回答
tips
プレビュー