読者です 読者をやめる 読者になる 読者になる

pylearn2 入門したい編

vagrant install とか pylearn2 install 済みの vm 作成など

vagrant install する

手早く vagrant 環境を整えて*1 (ref:http://blog.papix.net/entry/2013/04/27/141608 ),
github にある pylearn2 用の box を使って pylearn2 が実行出来る環境を作る *2

vagrant up する

git clone https://github.com/ironchief/pylearn2_vagrant.git
cd pylearn2_vagrant
vagrant up

を実行するだけだが,cpu によっては vt-x が使えなかったりするので*3
下記のように 32bit OS を見るように Vagrantfile を編集する *4

diff --git a/Vagrantfile b/Vagrantfile
index 247a5f6..47df3c5 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -2,9 +2,9 @@
 # vi: set ft=ruby :
 
 Vagrant.configure("2") do |config|
-  config.vm.box = "precise64"
+  config.vm.box = "precise32"
 
-  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
+  config.vm.box_url = "http://files.vagrantup.com/precise32.box"
 
   # config.vm.synced_folder "vm", "/home/vagrant"

ssh_config に vm の設定を追加する

無事 vm が作成できたら,vm の情報を .ssh/config に追加する*5
具体的には vgrant ssh-config で出力された文字列を,
.ssh/config に貼りつけ

vagrant ssh-config --host pylearn2
Host pylearn2
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/hoge/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

カレントに data と pylearn2 のディレクトリがあるので,後は楽しむだけですね

vagrant@precise32:~$ ls
data  postinstall.sh  pylearn2

チュートリアルを実行する

チュートリアルで使うデータを集める

sudo chown -R vagrant:vagrant pylearn2
mkdir -p /home/vagrant/data/mnist/
cd /home/vagrant/data/mnist/
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
gunzip -d train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
gunzip -d train-labels-idx1-ubyte.gz

train.py を使うのでパスを通す

export PATH=~/pylearn2/pylearn2/scripts/:$PATH

mnist のチュートリアル

mnist データセットチュートリアル実行
cd /home/vagrant/pylearn2/pylearn2/scripts/tutorials/dbm_demo/
train.py rbm.yaml
weight の可視化
pylearn2/pylearn2/scripts/show_weights.py pylearn2/pylearn2/scripts/tutorials/dbm_demo/rbm.pkl  --out mnist.png --border


自分でデータを作る

``実装ディープラーニング''*6 で触れられているように,
emotions *7 辺りを参考にするのが良い

  1. 用意した画像 を左上から走査して csv に保存
    • ラベルと素性の値をカンマで区切って,素性の値はスペースで区切る
    • 1行が1つの画像なり文書なりに対応する
    • もちろん,データは dense なベクトルとして表現する
  2. emotions_dataset.py *8 をコピーしてパスなどを書き換える

という手順を踏めば*9 datasets に加えることができる

csv のイメージ
label1, feature1 feature2 feature3 ... featureN
label2, feature1 feature2 feature3 ... featureN

twitter アイコンを使って rbm で学習する

自作データで deep learning する例として twitter アイコンを対象に,
ガウシアン-ベルヌーイ rbm を使って表現学習を行う

入力*10

適当なサイズ*11 にリサイズし,グレイスケール化したものを csv 化する*12

python img2csv.py "tmp_imp/*" train.csv

train.csv を data ディレクトリに設置

mv train.csv ~/data/hoge/

hoge データセット用のクラス*13を適切な場所に設置する

sudo cp hoge_dataset.py /usr/local/lib/python2.7/dist-packages/pylearn2-0.1dev-py2.7.egg/pylearn2/datasets/

train.py で実行

train.py grbm.yaml

小一時間ほど待ってから weight の可視化

show_weights.py grbm.pkl --out ~/w.png

写真は学習しにくいのかなぁ...という印象

今回はグレースケール化かつサイズを同じサイズに合わせたが,
カラーの画像を扱うのなら grbm_smd *14
カラーで異なるサイズの画像を扱うのならば multimodal *15 が参考になるのではないかとおもう

ただ,grbm_smd も multimodal も入力画像からNxNのパッチ画像を抽出し*16
それを第1層の入力とするため,例であげた MNIST や twitter の場合と異なり,
分かりやすい重みの画像化というのができない(パッチ画像が出力される)

*1:ついでに rbenv とかいれた

*2:numpy, scipy あたりが詰みやすい

*3:Intel(R) Atom(TM) CPU D510 @ 1.66GHz とか

*4:precise は ubuntu 12.04 LTS のことですかね?

*5:vagrant ssh で接続しても良くて,この辺りは好みかなと

*6:http://www.slideshare.net/yurieoka37/ss-28152060

*7:https://github.com/lisa-lab/pylearn2/tree/master/pylearn2/scripts/icml_2013_wrepl/emotions

*8:https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/scripts/icml_2013_wrepl/emotions/emotions_dataset.py

*9:https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/scripts/icml_2013_wrepl/multimodal/lcn.py で画像から ndarray にして保存しているので,csv 化が必須というわけではない

*10:観測範囲にあるアカウントの写真とイラスト採用している

*11:今回は 48x48

*12:https://github.com/laughing/grbm_sample/blob/master/img2csv.py

*13:https://github.com/laughing/grbm_sample/blob/master/hoge_dataset.py

*14:https://github.com/lisa-lab/pylearn2/tree/master/pylearn2/scripts/tutorials/grbm_smd

*15:https://github.com/lisa-lab/pylearn2/tree/master/pylearn2/scripts/icml_2013_wrepl/multimodal

*16:あまりちゃんと調べてないけど,たたみ込み(convolution)を行っているのだと思う