studylog/北の雲

chainer/python/nlp

chainer-Variational-AutoEncoderを使ってみた

最近早起きした日は北海道神宮円山公園へリスに会いに行ってます。山のリスと違って人馴れしまくってて自分から足元にやってくるエゾリス。多分エサやってる人がいるんだろうな。こんな至近距離で撮れたのは初めてなので記念にアップ。
f:id:kitanokumo:20150921095051j:plain
近所を散歩してたらリスに囲まれるなんて、北海道ってやっぱりすごい。贅沢。

Variational-AutoEncoder

略してVAEとやらを最近勉強してますが論文・日本語の解説・コードを見ても何がなんだかわからない。わからないんだけど面白そう。

応用例。
http://deeplearning.jp/wp-content/uploads/2014/04/dl_hacks2015-04-21-iwasawa1.pdf
http://www.slideshare.net/beam2d/semisupervised-learning-with-deep-generative-models
これらは主に画像の例だけど自然言語にも適用できないのかな?と思案中。

chainer実装

chainerで書いてくれている方がいた。ありがたい( -人- )github.com
Variational Autoencoderでアルバムジャケットの生成 - Use At Your Own Risk


試してみたけれどまだ自分で学習させるところまではいかなかった。VAE自体を全く理解できていないので、どうやって入力したらいいのかわからない。うまくいったら追記します。

学習済みのモデルが配布されてたのでそれを利用して生成だけやってみたんだけど多分ハマる人いそうなのでメモ。

pickle化されてる学習済みモデルはmodelディレクトリの中にzip化されてますが、これがどうも現時点の最新バージョン1.3系では読み込めない。linearが無いと言われる。多分chainer本体の構造自体が変わったからなのかな。保存しているmodelを見るとFunctionSetを継承したclassにforword等の学習コードが入ってて、これだとchainerのバージョンによっては読み込めなくなることがある(参考:chainerメモ9 保存するmodelに学習するコード等を含ませない - studylog)

pip uninstall chainer #一回削除
pip install chainer=="1.2.0" #これでバージョン指定インストール

で1.2.0に落としたら成功。ちなみに1.1.0はダメでした。
modelディレクトリのzipを解凍してから、

python generate_yz_x.py --model model/mnist_VAE_YZ_X_1000.pkl --dataset mnist --n_samples 30

これでgenerated_yz_xディレクトリに30個の画像が生成される。
f:id:kitanokumo:20150921101758j:plain
f:id:kitanokumo:20150921101800j:plain
f:id:kitanokumo:20150921101802j:plain
f:id:kitanokumo:20150921102405j:plain
f:id:kitanokumo:20150921102406j:plain
f:id:kitanokumo:20150921102407j:plain
f:id:kitanokumo:20150921102626j:plain
f:id:kitanokumo:20150921102627j:plain
f:id:kitanokumo:20150921102628j:plain
f:id:kitanokumo:20150921102629j:plain
f:id:kitanokumo:20150921102630j:plain

一番左の数字だけは誰かが書いた実際のデータ。
これを与えると同じような雰囲気(筆跡・線の太さ)で右の0~9の数字を生成する。
最初は右の数字も誰かが書いたmnist内にある実データで似たようなのを拾ってきてるだけだと思ってたけど、自分で生成しちゃってるってのはすごいなあ。

もうひとつ、Street View House Numbers (SVHN)というデータセットを使った学習モデルも。model/svhn_VAE_YZ_X_1000.pklの方ですね。これはGoogleストリートビューで収集した家・マンションの部屋番号数字の認識タスク用データだそうです。カラー。

python generate_yz_x.py --model model/svhn_VAE_YZ_X_1000.pkl --dataset svhn --n_samples 30


f:id:kitanokumo:20150921132536j:plain
f:id:kitanokumo:20150921132542j:plain
f:id:kitanokumo:20150921132543j:plain
f:id:kitanokumo:20150921132544j:plain
f:id:kitanokumo:20150921132546j:plain
f:id:kitanokumo:20150921132547j:plain
f:id:kitanokumo:20150921132548j:plain
f:id:kitanokumo:20150921132538j:plain
f:id:kitanokumo:20150921132539j:plain
f:id:kitanokumo:20150921132540j:plain
f:id:kitanokumo:20150921132541j:plain

mnistと比べると少し精度が落ちているように見えるけど色はほぼ完璧に再現している。すごいなあ。

これ言葉に適用できたら面白いと思う。