はじめに
前回の続きです。
前回の記事では、画像上の任意の点の座標$ (u, v) $をを入力として受け取り、画像の値を出力するニューラルネットモデルを実装しました。
これをオートエンコーダのデコーダ部として使うことで、解像度に依存しない画像表現が行えます。
今回はこのデコーダに入力する座標値にアフィン変換を適用することを考えます。
各入力画像に対して適切なアフィン変換のパラメータを使うことができれば、画像の潜在表現が改善されることが期待できます。
実装
今回もVAEをベースにして、エンコーダ/デコーダともに全結合として実装しました。
- エンコーダの出力: 潜在変数$ z $の平均/分散 + アフィン変換のパラメータ
- デコーダの入力: 潜在変数$ z $ + 画像上の座標値$ (u, v) $
となります。
アフィン変換のパラメータは
- スケール係数
scale
- 回転角
theta
- 平行移動量
(tx, ty)
としました。
デコーダへ入力する座標値$ (u, v) $にこのアフィン変換を適用しておくことで、拡大/縮小/回転/平行移動された画像がデコーダから出力されるわけです。
出力
潜在次元数を8としてMNISTの学習を行います。
次のユニット数で実験します。
- エンコーダ: [28*28 -> 512 -> 392 -> 256 -> 8+8+4]
- デコーダ: [2+8 -> 32 -> 64 -> 32 -> 1]
python3 train.py --gpu 0 --epoch 100 --batchsize 128 --model affine3x
で、100エポック学習させた出力結果が以下です。
微妙な違いですが、よく見比べると生データでは大きさや角度が揃っているのがわかります。
この拡大/縮小、回転角度、平行移動量の情報を潜在変数から分離することができた、ということになります。
潜在変数の損失(gaussian_kl_divergence)の最終的な値を見ると、
アフィン変換あり
アフィン変換なし
となっていて、潜在表現が向上していることが確認できます。