キモオタがやってみるデータサイエンス〜その2:RBMでミスコンっぽい顔を知る〜
この記事ではこんなこと書くお
- RBMで特徴量の学習をしてみる
- pylearn2を本格的に使ってみる
記事の本文だお
どうも、キモヲタです。
さて、前回はDeepLearningで共通顔画像の抽出と題してやってみましたが、あまりうまくいきませんでした。*1
さて、前回はChainerでAuto-Encoderだけを試してみたわけですが、画像認識系タスクでDeepNNを使う際は、RBM(制約つきボルツマンマシン)を使うことが多いようです。*2
なので、今回はRBMで特徴量の学習と可視化をしてみることにします。 (なお、RBMの概説はこの記事が大変ためになります。マジ感謝です)
はじめに断っておきますが、きょうの学習結果画像は怖いです。*3
さて、RBMを使おうとしてみるわけですが、Chainerではどうやらキツイようです。 (そう言っているのはこんなツイートを見たから。)
そこで、今回はPylearn2を利用することにします。
Pylearn2でAV女優さんの顔画像を学習しようとしたキモい人もいるわけですし、きっと可能でしょう。
Pylearn2を使う
正直いうと、セットアップはとても面倒です。*4
Pylearn2がすでにセットアップ済みのVegrantのイメージファイルがあるので、ちょー面倒だったら、イメージファイルでコンテナを起動したほうが早いかもしれません。
とはいえ、インストールしちゃいました。
pylearn2のインストールからデモスクリプトの実行までをシェルスクリプトにまとめたので、どなたかの参考になれば幸いです。
なお、.bashrc
に環境パスを通してありますが、実は必須ではありません。
他のpylearn2でも環境パスを通す。みたいな説明が多いですが、「パスを通しておくと、デモスクリプトが簡単に実行できるよ」というだけで、そんなメリットがないです。
実際、trainingする時は自分でスクリプト書いたほうが手間がかからないように思いました。
pylearn2利用の大体の流れ
- trainingデータを用意する
- yamlファイルにトレーニング設定を記述する
- training実行
1は画像がすでに特徴量行列になっていれば、楽勝です。 (後になって知ったのですが、Pipelineで前処理を繋げられる機能があるようです。試してないけど)
何かの役に立つかもしれないので、trainingスクリプトをさらしておきますね
yamlファイルにテンプレを書いておいて、trainingスクリプトで変数を埋めている感じです。
学習データは前回と同じです。グレースケール化した100*100の顔画像です。 (100*100なので、10,000次元です。これ、yamlファイルのnvisに記述するのを忘れないでくださいね。)
可視化してみる
Pylearn2にはshow_weight.py
とかいう可視化する神スクリプトがあるのですが、使えませんでした
Exception: Tried to call get_weights_view on a dataset that has no view converter
とかいう例外が発生します。
調べても意味がよくわからなかったので放置です・・・・
じゃあ、どんすんねん?って話ですけど、「スクリプトがないなら、書けばいいじゃない?」(神の声)
要は学習した重みを可視化すればいいわけです。書きました
可視化してみた結果www
さて、心の準備はできましたか??
出しますよ!
おしっこちびるかと思うほど、怖かったです。
さて、怖いながらもしっかり観察してみました。
Auto-Encoderを使った時の学習よりもきれいに特徴量が取れています*5
類別すると、4種類の写真がありそう(な気がします)
赤い四角が私がつけました。髪の分かれ目がしっかり特徴に出ているなぁ。と感心したんです。
え、なんでそんなとこ見たのかって?そんなの髪の分け目フェチだからにきまっているじゃないですか。
まとめ
- 今回の設定としょぼいマシンと私のサボりグセを考えると、RBMの方がきれいな特徴量を出してくれた。ありがとう
- 髪の分け目はとっても重要だお!
- せっかく特徴量をとったから何かしたい。うひひひ