Pytorchの勉強を続ける
Pytorchの勉強を続けています。前回、基本的なGANは動いたと書きましたがどうもうまく学習できていないみたい・・・
オートエンコーダ(AE)のほうが学習状況の確認がしやすい(損失関数が1つだけなのでこいつが単調に減少していってくれればいちおう学習が進んでいると判断できる)ので、基本のAEまで戻ってプログラムしています。
今作っているAEは入力(下図の左)の3Dデータ(32x32x32)をエンコーダネットワークで100次元のベクトルに変換し、このベクトルをデコーダネットワークで元のサイズ(32x32x32)の3Dデータ(下図の右)に変換しています。
単純なAEだと損失関数としてエンコーダの入力とデコーダの出力の差(Binary Cross Entropy)を使うのですが、今回は出力が値のばらつきが正規分布になっているかというKL-Divergence(カールバックライブラーダイバージェンス)の項を追加しています。変分オートエンコーダと呼ばれています。
エンコーダへの入力とデコーダの出力の例 (2)
KL項の重みをどのくらいにするかにもよるのですが、変分オートエンコーダでは角やアンテナなどの特徴が失われてしまうことが多いです。
比較的学習しやすい変分オートエンコーダとシャープな出力が得られるGANを組み合わせるという手法もあるようです。