男のための機械学習〜RBMでA◯女優さんの共通特徴量を得よう〜
いま、巷で話題(3年くらい前からだいぶ話題だけど)のDeep learningをア◯でも使えるpylearn2
を使って見る。
Deep learningとは?
一言で言うと「教師なしのニューラルネットをいっぱいつなげて多層ネットワーク化したもの。」
いままでは
前処理職人の丹精を込めた特徴量作り → 分類器(SVMとか、ロジスティック回帰とか、なんでもいいので関数)の学習
だったのが、
黒魔術で特徴量作り → 分類器(SVMとか、ロジスティック回帰とか、なんでもいいので関数)の学習
にできる。
黒魔術をもうちょっと紐解く
「黒魔術」って言ってるところでやっていることは「ベストな写像関数の学習」
もう少し、言葉を厳密に表現すると、「入力/ノイズ付き出力の変換をうまく表現できる関数の学習」
この関数はできるだけ良い[1]条件で別の空間に写像する。
なので、この関数が学習できると、特徴量空間に射影する関数を学習できたことになる。
[1] 「何が、どういいのか?」はやはり黒魔術である
え、そんなのわかんねえし、という人向け
「そんなのわかんねえよksが」っていう人は「画像をいっぱい入力したら、似たところを自動でとってきてくれる便利なツール」って認識しておけばいいんじゃないっすかね(鼻くそほじほじ)
お手軽Deep learningをやってみよう
口でいうのは簡単だが、それをコードを落とすとなると難しい。
しかし、No problemだ。どっかモントリオール大学の優秀な学生達が、Deep learning用汎化ライブラリ(Theano)を作成してくれた。
しかし、これでもやや敷居が高い。無能な私にはチュートリアルで終わるのが精一杯だった。
という状況の中、さらに便利なツールが登場した!それがPylearn2である。
Theanoのラッパーとして、アホでも使える程度の簡単さにしてくれた。まだ、開発版ではあるが、十分に遊べるレベルになっている。
今回は、Pylearn2のテスト使用ということで、ちょっと遊んでみた。
顔の特徴量抽出をしてみよう
Deep Learningは元々は画像認識分野から出てきた(Hintonという偉いおっさんが初めて使った)。
その時は、画像認識(画像を入力して、写っている物の名前を当てるタスク)で使われていた。
そこで、脅威の性能を出してしまったばかりに、例によってGoogleが興味をもって、ここにGoogleネコが誕生した
この時のGoogleのアイディアは「いっぱいネコ画像を入力に与えたら、ネコの顔だけ抽出してくれる関数を学習してくれんだろ。バーロ」みたいな感じだった。
ここに歪んだ欲望と男のロマンをちょっとだけ加えると次のようになる。
「いっぱい好みの女優さんの顔画像を与えたら、自分の好みの顔を学習してくれんだろ。バーロ」
と、いうことでやってみた。きっとHintonも喜んでくれるだろう。
pylearn2で顔パーツを学習してみよう
ごくごく簡単にpylearn2を使うまでの手順を書くと、こうなる
- (前提) python, git, pipを使える状態。numpyとscipyがインストールされている。
- 1 theanoをインストールする
- 2 pylearn2をインストールする。(とはいってもgit cloneをする)
python, git, pip, numpy, scipyの使用準備の説明は今回、省く。
theanoのインストール
pip install theano
でおしまいなはず(設定がうまくいっていれば)
pylearn2のインストール
インストールと準備の段階では以下のサイトも参考になる
必要なライブラリ
- PIL
- PyYAML
- IPython
- Cython
全部、pip install
コマンドで楽勝である。
ただし、PILはpip install PIL
ではダメでpip install pillow
と打たないとダメらしい。参考
pylearn2のインストール
次の2つのコマンドを実行すれば、うまくいく(はず)
git clone git://github.com/lisa-lab/pylearn2.git
python setup.py develop
pylearn2のテスト
pylearn2の使い方は、簡単にまとめると、
このサイトの下の方に、CIFAR10とMNISTという画像データセットでのサンプル実行例がある。
- http://deeplearning.jp/?p=196
- http://shower.human.waseda.ac.jp/~asaitaku/toolsManual/_build/html/python/pylearn2/main.html
pylearn2で、女優さんの顔から特徴量を抽出してみよう
画像の学習のために、pylearn2を更に簡単に使えるコードが用意されてる。ここ
このコードがあれば、画像から色情報csvファイルへの変換、レシピyamlを使った学習までとっても簡単。
やってみること
- DMM女優名鑑から好み(主観)の女優さんの画像を集めてくる。
- 女優さんの画像を入力にして、Deep learningでモデルを構築してみる。
- 共通する特徴量を抽出する
顔画像の収集
入力画像はDMM女優名鑑から集めてくる。顔画像は155*155で保存されているので、好都合。
wgetコマンドで簡単に画像を落とせる。
URLの構成規則はhttp://pics.dmm.co.jp/mono/actjpgs/姓_名.jpg
になっているのと、割りと簡単。
マシンは型落ちMacBookなので、学習量を少なくするため、10枚ぐらいに
集めてきた顔画像はこんな感じ。(あくまで私の好みです)
画像のグレースケール化とcsvへの変換
画像のグレースケール変換は、PILライブラリを使って簡単にできる。
こんなコードを書いた。
#! /usr/bin/python
from PIL import Image
from PIL import ImageOps
import os
import sys
if __name__ == "__main__":
if len(sys.argv)==3:
input_path = sys.argv[1]
output_path = sys.argv[2]
else:
sys.exit("Need 2 args. Input ans Output path")
input_image = Image.open(input_path)
output_image = ImageOps.grayscale(input_image)
output_image.save(output_path)
python img2csv.py グレースケール変換した.jpgのリスト train.csv
を実行する。
クラスの用意とパス設定
クラスファイルをpylearn2で呼び出せるようにしておく。
ここからクラスが記述されたファイルを落としてきて、pylearn2/datasets/
に配置する
環境変数は
export PYLEARN2_DATA_PATH=train.csvとgrbm.yamlが置いてあるパス
export PYLEARN2_VIEWER_COMMAND="opne -Wn"
[2]
[2]はmac専用のコマンド。windowsの場合は・・・・知らね
モデルの学習
今回はグレースケール化して、サイズも同だし、いろいろ考えるのも面倒なので、「制約付きボルツマンマシン(RBM)」で片付ける。(コード中のアルゴリズムではgrbm)
カラー化していれば、grbm_smd、サイズが違えばmultimodalを使った方がいいだろう(って、公式マニュアルに書いてあったお。)
実行するコマンドは、grbm.yamlが置いてある場所で、
train.py grbm.yaml
を実行するだけ。
1イテレーションはこんな画面
学習結果の確認
学習した関数の出力を画像で表示するには
show_weights.py grbm.pkl
を実行する。
結果はこんな感じだった
夜に見たら、おしっこちびりそう・・・・
椎名りくが強すぎワロタ
いくつかの特徴量では、うまく人間共通の顔パーツを学習できている様子。
あくまで考察だけど、椎名りくの画像だけ他と違って、セーラー服で、ラインが入っていたため、外れ値が多かったのでは・・・とかそんなことを思いました。
ちなみに私はブレザー派です
まとめ
Deep learningって楽しいね!