LoginSignup
13
8

More than 5 years have passed since last update.

オートエンコーダにアフィン変換を組み込む

Posted at

はじめに

前回の続きです。
前回の記事では、画像上の任意の点の座標$ (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,

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

13
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8