計画編で目論んだのは以下のように
①pix2pix(unet版)にL1L2ノルムを導入して汎化特性を持たせよう
②pix2pix(encoder-decoder版)に層間写像を導入してさらに綺麗な画像を作ろう
って、まともな戦略だった。
結果は、簡単に言うと。。。失敗!
①のUnet版の汎化は、一層のみの層間写像でさえ、導入すると未知データの画像は壊れました。
ということで、①も②もここで失敗です。
※簡単に書きましたが一週間ほぼ回し続けての結果でマシンはメモリフルになるしですが、パラメータの特性を勉強するには適当な題材でした。
しかし、②の層間写像はあきらめたが、DropoutやL1L2ノルムの適用の調整は良い効果も見られたので以下示したいと思います。
これらの調整をやるためのコードを以下に置いておきます。
MuAuan/pix2pix_alt
Dropout及びL1L2ノルムの効果について
この両者はそれぞれ過学習の抑制として効果のある手法だとされています。
しかし、やってみるとDropoutの方が格段に効果がわかりやすいです。
ということで、以下はDropoutの効果を中心に実施したことを示すこととします。
pix2pix(encoder-decoder版)は、層間写像はしませんが、Dropoutはi<2に導入しています。これを調整しようということです。
当初は、dropout(0.5)としています。これはオリジナルのpix2pixでその値だったからです。しかし、層間写像を止めた時点で汎化特性は緩めてもいいかもしれないので、もっと小さな値にしてもいいかもしれません。
ということで、そもそもDropout無しとdropout(0.25)、dopout(0.5)、dropout(0.75)、そしてdropout(0.9)をやってみました。
200epoch回した時点でのvalidationデータでチェックしました。結果は以下の通りです。
結果
Dropout(0) 200epoch
Dropout(0.25) 200epoch
Dropout(0.5) 200epoch
Dropout(0.75) 200epoch
ということで、構造が同じ場合はあまり差がありませんが、それでもDropout(0.25)か(0)当たりが一番よさそうです。05,0.75では目が消えていきます。
Dropout(0), L1L2(0.0001) 500epoch
encoder-decoder版 1000epoch
まとめ
いろいろパラメータを動かしてvalidationデータの出力を見たが、過学習なく安定した出力はencoder-decoder版で得られた。
課題
実は、encoder-decoder版では細部が甘く、epochを回しても学習データでさえピンボケが消えない。一方、unet版の収束性は非常にいい。
ということで、議論は振り出しに戻ってしまった