1

私はフェイスブックのペーパーである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
4

3 に答える 3

0

私たちが知っているように、バッチ正規化の学習擬似コードは

moving_mean = None;
moving_variance = None;

if not moving_mean:
  moving_mean = current_batch_mean
else:
  moving_mean = moving_mean * momentum + current_batch_mean * (1-momentum)

if not moving_variance:
  moving_variance = current_batch_variance
else:
  moving_variance = moving_variance * momentum + current_batch_variance * (1-momentum)

ここがポイントです。

tensorflow と keras のデフォルトの運動量は 0.99 で、そのまま使用すると、次の更新値は新しい更新値に影響しません。pytorch の場合、デフォルトの運動量は 0.1 で、tensorflow または keras の 0.9 と同じです。

修正された運動量の値により、改善された結果が得られました。

誰かが私のような症状に苦しんでいる場合は、運動量の値を下げてみてください。

ありがとう。

于 2019-10-17T08:19:57.343 に答える