私はフェイスブックのペーパーであるDCGanを実装しようとしてきましたが、以下の 2 つの問題によってほぼ 2 週間にわたってブロックされました。任意の提案をいただければ幸いです。ありがとう。
問題 1:
DCGAN 論文では、ジェネレーターとディスクリミネーターの両方に BN (バッチ正規化) を使用することが提案されています。しかし、BN無しよりBN有りの方が良い結果は得られませんでした。
私が使用した DCGAN モデルをコピーしました。これは、DCGAN ペーパーとまったく同じです。オーバーフィッティングによるものではないと思います。(1) 最初のノイズ画像と同じノイズを表示し続け、訓練されていないように見えるからです。(2) Loss 値は非常に安定しており、gan と discriminator の両方が実際には変更されていません。(0.6~0.7程度で、両モデルが倒れたときのような落ち込みや跳ね上がりはありません)
問題 2:
float16 を使用すると、常に以下のモデルで Nan が返されます。イプシロンを 1e-4 1e-3 両方に変更しましたが失敗しました。そして、ここでもう 1 つの質問があります。BatchNormalization を使用しない場合、Nan になる可能性があります。それは十分に理にかなっています、私はそれを得ることができます。しかし、BatchNormalization を使用すると、すべてのレイヤーで正規化されます。結果が非常に大きな数または非常に小さな数になったとしても、結果がほぼ中央に配置され、フェードアウトが発生しないように、すべてのレイヤーでバッチ正規化されます。ではない?それは実際には私の考えですが、何が間違っているのかわかりません..誰か、助けてください。
===== ジェネレータ =====
入力番号 (なし、128) <= 潜在
Dense # (None, 16384)
BatchNormalization
LeakyReLU
リシェイプ # (なし、4、4、1024)
Conv2DTranspose # (なし、4、4、512)
バッチ正規化 LeakyReLU
Conv2DTranspose # (なし、8、8、256)
バッチ正規化 LeakyReLU
Conv2DTranspose # (なし、16、16、128)
バッチ正規 化 LeakyReLU
Conv2DTranspose # (なし、32、32、64)
バッチ正規化 LeakyReLU
Conv2DTranspose # (なし、64、64、32)
バッチ正規化 LeakyReLU
Conv2DTranspose # (なし、128、128、16)
バッチ正規化 LeakyReLU
Conv2D # (なし、128、128、3)
===== 識別器 =====
Conv2D # (なし、128、128、3) LeakyReLU
Conv2D # (なし、64、64、16) BatchNormalization
ドロップアウト
LeakyReLU
Conv2D # (なし、32、32、32)
BatchNormalization
ドロップアウト
LeakyReLU
Conv2D # (なし、16、16、64)
BatchNormalization
ドロップアウト
LeakyReLU
Conv2D # (なし、8、8、128)
BatchNormalization
ドロップアウト
LeakyReLU
Conv2D # (なし、4、4、256)
BatchNormalization
ドロップアウト
LeakyReLU
Conv2D # (なし、2、2、512)
BatchNormalization
ドロップアウト
LeakyReLU
フラット化
ドロップアウト
高密度
私が最後に試したハイパーパラメータは以下のとおりで、トレーニング画像にガウス ノイズを追加することを忘れていませんでした。
image_shape => (128, 128, 3)
latent_dim => 128
channels => 3
iterations => 10000
batch_size => 128
epsilon => 0.005
weight_init_stddev => 0.02
beta_1 => 0.5
discriminator_lr => 0.0002
gan_lr => 0.0002