はじめに

前回の続きです。
前回の記事では、画像上の任意の点の座標$ (u, v) $をを入力として受け取り、画像の値を出力するニューラルネットモデルを実装しました。
これをオートエンコーダのデコーダ部として使うことで、解像度に依存しない画像表現が行えます。
今回はこのデコーダに入力する座標値にアフィン変換を適用することを考えます。
各入力画像に対して適切なアフィン変換のパラメータを使うことができれば、画像の潜在表現が改善されることが期待できます。

実装(github)

実装

今回も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エポック学習させた出力結果が以下です。

元データ
original.png

出力
output.png

アフィン変換を抑制した生のデコーダ出力
normalized.png

微妙な違いですが、よく見比べると生データでは大きさや角度が揃っているのがわかります。
この拡大/縮小、回転角度、平行移動量の情報を潜在変数から分離することができた、ということになります。
潜在変数の損失(gaussian_kl_divergence)の最終的な値を見ると、

アフィン変換あり
"main/z_loss": 1.8669424057006836,

アフィン変換なし
"main/z_loss": 2.214595079421997,

となっていて、潜在表現が向上していることが確認できます。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.