はじめに
最近VAEに関する記事を書いた。
潜在変数の一部をアフィン変換のパラメタとして分離する話は、生成モデルではない普通のAE(オートエンコーダ)でも通用する。元記事の元記事を読めば、コンセプト自体はVAEに特有の道具を使っているわけではないので、AEで動くのは「それはそう」なのである。
本記事では自分の手元で実装して確かめたので、その報告である。
実装
以下に置いた。Enjoy!
再構成誤差の計算にMSEloss(デフォルト)を使う場合
$ python sample_ae.py --use_affine
- 再構成誤差の計算にBCElossを使う場合
$ python sample_ae.py --use_bce --use_affine
実装上の工夫
VAEのときにはアフィン変換のパラメタは標準正規分布を事前分布に持っていた。よってオートエンコーダにおけるencoder部も、0を中心に適当な範囲でスケーリングしておけば、期待通りに動くだろうということである(楽観的)。以下、encoder部の実装を示す。tanhのrangeが[-1, 1]であるので、適当にスケーリングしている。scaleのデフォルト値が3.5になっているが、強いこだわりはない。3.0や4.0でも動く。あまり大きな値になると、ドアップのような生成結果になった(気がする)。
def encode(self, inputs: Tensor, scale: float = 3.5) -> Tensor: """Encode input image. Args: inputs (torch.Tensor): input image scale (float): scaling factor Returns: latent (torch.Tensor): bottleneck features in latent space """ hidden = self.encoder(inputs) latent: Tensor = scale * torch.tanh(hidden) return latent
実験結果
モデル訓練後、アフィン変換を外して再構成した画像たちを図1に示す。比較のため,入力画像と再構成画像のペアを2カラムずつ並べた。
例えば1は概ね向きが揃っており、また3、5を見ても、向きやスケールが概ね揃っていることが見て取れる。8は歪みが取れている様子が良く分かる。総じて完璧な正規化ではないが、普通のAEでもそこそこ動くという結果は示された。
おわりに
ちょっとVAEから関連ネタが続いているが、実装は楽しいからよし。