GAN実験2

GANのいろんなパーツについて効果を確認しながら実験していく記事の2

 

前回はGenerator:Discriminator=1:1で訓練してたらDiscriminatorが圧勝してしまったので、今回はDiscriminatorを抑えて実験してみる。

 

「Discriminator Lossが0.6以上の場合のみDiscriminatorを訓練」、「Discriminator Lossが0.3以上の場合のみDiscriminatorを訓練」の2パターンを実験した。

Discriminator LossにはBCE Lossを使っているので、Discriminatorの正答率は前者で55%、後者で74%くらいを維持することになる(Discriminator Lossは真画像、偽画像のLossを平均して計算している)。

 

以下結果

Discriminator Lossがそれぞれ0.6、0.3付近でウロウロしてたのでコントロールは上手くできていた。

 

f:id:CH1008:20200421144925j:plain

Discriminator Lossを0.6に維持(350epoch)

f:id:CH1008:20200421145032j:plain

Discriminator Lossを0.3に維持(350epoch)

明らかにDiscriminator Lossを0.6に維持した方が良い画像を生成できている。

学習の途中を見てても0.6の方が良かった(今度から学習過程をgifにしよかな...)。

前回のDiscriminatorに何も制限を加えないタイプと比べても、0.6は上手く学習が進んでいるように見える。

一方0.3は全体的なクオリティが低めだし、似たような画像を生成している(mode collapse)。

 

DiscriminatorはGeneratorと拮抗する位が良いのかなと思うものの、0.3と比べてDiscriminatorがさらに強い前回の方が良いのはなぜなのか?

このあたり次回にちょっと調査したい。

*2020/5/1追記

DiscriminatorとGeneratorの訓練比率を「Lossが0.3以上なら1:1、以下なら1:5」みたいにして最低でも5回に1回はDiscriminatorが訓練されるようにしてみた。Lossの動きは(300epoch付近まで)およそ同じだったが、まあまあ綺麗に生成できていた。おそらくGeneratorのみ学習し続けることがよくないのかもしれない。

 

残差接続とかHinge Lossとかspectral normalizationとか試したいのが多すぎる...

StyleGAN的な構造も試したい...