Wednesday, July 1, 2015

Deep Learning part1

Deep Learning part1

最近周りでよく話を聞くようになったDeep Learningとやらに触ってみるのです。Deep Learningを構成する各技術の細かい話と、実際にDeep Learningを使ってみる話を進めているけど、ここでは実際に使ってみるをやりたい…!

今回はインストールと動作確認までやるぞ。

Caffe

Deep Learningを実装したライブラリはいくつかあるが、中でもpythonで書かれたものが多い印象。今回は画像認識に特化しているというCaffeというものを触ってみる。

環境

Windows 8.1の上にHyperVでubuntu 14.04を用意した。このubuntuの上にCaffeの実行環境を構築する。

  • python 3.3+で動くと公式が書いているから3系を入れるか…保険を兼ねてpyenvを導入しておく。→やっぱり3.3+系は駄目だったでござる。
  • 本当はCUDA使えるnVidiaのGPUが欲しいところだけどそんなものはない。CPUモードで頑張ってみよう。

インストール

# (1)
sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
sudo apt-get install gfortran
sudo apt-get install python-numpy
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bash_profile
pyenv install 2.7.10
# (2)
git clone https://github.com/BVLC/caffe.git
# (3)
sudo apt-get install libatlas-base-dev
# (4)
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
# (5)
cd caffe
cp Makefile.config.example Makefile.config
vim
+ CPU_ONLY := 1
- #  CPU_ONLY := 1
make all
make test
make runtest
(6)
cd python
for req in $(cat requirements.txt); do pip install $req; done
cd ../
make pycaffe
(7)
echo 'export PYTHONPATH=~/projects/caffe/python/:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc

(1)

Caffeが必要とするパッケージ類をつらつらとインストール。pythonは3.3+系だと動かないかもな(そして実際その通りだった)と思ってpyenvを導入してバージョンを簡単に切り替えできるようにした。2.7.10で多分動いたと思う。


(2)

Caffeのリポジトリをclone。


(3)

BLASのインストール。

The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing basic vector and matrix operations.

ふむ…ベクトル・行列計算用のライブラリってところか。


(4)

(1)と同じく、必要らしいパッケージのインストール。


(5)

Caffe本体をビルド・インストール。Surface3 ProにNVidiaのGPUがささっているわけないので、CPUモードに変更してあるよ。


(6)

CaffeのPythonクライアントのインストール。ここのpipインストールに結構時間がかかるorz。後、フォートランのコンパイラが無いぞ!とかね。


(7)

PythonのパスにCaffeを追加して、おそらくインストール完了と思われる。

Trouble Shooting

ImportError: No module named 'scipy'

pip installの最中にImportError: No module named 'scipy'って言われる。インストールできてないし、そりゃそうだ。fortranのコンパイラを入れてなかったのかいけなかった。

sudo apt-get install gfortran

python 3.3+だとimport caffeした時にいろいろエラー

python 2.7.10に切り替えてみる。時間かかって面倒だけどpip installもやり直し。

yukaary@yukaary-ubuntu-ein:~/projects/caffe/python$ python
Python 2.7.10 (default, Jul  1 2015, 15:55:03) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
libdc1394 error: Failed to initialize libdc1394
>>> caffe
<module 'caffe' from 'caffe/__init__.py'>

うまくいったなぁ。2015/7/1現在、まだpython 3系は怪しいっぽいね。

CUDAのインストールって必要か?

インストールはこんな感じ。1,2Gくらいダウンロードするから時間がかかる。

wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo apt-get update
sudo apt-get install cuda

NVidiaのグラフィックボードで、かつCUDAサポートしているものが無いと意味ないと思うんだけどな。うん…CPUモードで動かす環境しかない時はこれいらない気がする。

動作確認

cd ~/projects/caffe/data/mnists
./get_mnist.sh
cd ~/projects/caffe
vim 
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh

mnistの手書き数字のデータかな?よく使われてる。GPUモードの設定になっているからCPUモードに変えておく。

最終的にこんな出力がでてきたらうまくいってるんじゃないかな…!!CPUx2割り当てたゲストマシン(ubuntu 14.04)上で、およそ30分かかった。

$ vim examples/mnist/lenet_solver.prototxt 
yukaary@yukaary-ubuntu-ein:~/projects/caffe$ ./examples/mnist/train_lenet.sh 
libdc1394 error: Failed to initialize libdc1394
I0701 17:00:13.311028 41368 caffe.cpp:117] Use CPU.
I0701 17:00:13.311414 41368 caffe.cpp:121] Starting Optimization
I0701 17:00:13.315642 41368 solver.cpp:32] Initializing solver from parameters: 
test_iter: 100
test_interval: 500
...
I0701 17:33:45.084625 41368 solver.cpp:486] Iteration 9900, lr = 0.00596843
I0701 17:34:00.747910 41368 solver.cpp:361] Snapshotting to examples/mnist/lenet_iter_10000.caffemodel
I0701 17:34:00.758690 41368 solver.cpp:369] Snapshotting solver state to examples/mnist/lenet_iter_10000.solverstate
I0701 17:34:00.814043 41368 solver.cpp:276] Iteration 10000, loss = 0.00441304
I0701 17:34:00.814121 41368 solver.cpp:294] Iteration 10000, Testing net (#0)
I0701 17:34:08.871933 41368 solver.cpp:343]     Test net output #0: accuracy = 0.9904
I0701 17:34:08.872099 41368 solver.cpp:343]     Test net output #1: loss = 0.0295519 (* 1 = 0.0295519 loss)
I0701 17:34:08.872123 41368 solver.cpp:281] Optimization Done.
I0701 17:34:08.872136 41368 caffe.cpp:134] Optimization Done.

出力の最初のほうに、どういうレイヤ構成で実行するか書き出してあるね。。これをカスタマイズできると、場合によってはもっと良い学習ができるんだろうな。

次回以降

自前のデータを用意して学習させたいな。させたいな。少しずつ使い方を覚えていこう。

ああ~~~NVidiaのCUDA使えるGPUが欲しいんじゃ~~~。

参考サイト

よく分からない用語の整理

Pooling

画像処理絡みの用語で、filtering、normalization辺りは分かるけど、Poolingってなんじゃろな?画像を細かく切り出してプールしておくって話なのか?

Max Pooling 法とは、あるウィンドウサイズの中で 最大の値を代表値としてサブサンプリングする方法。ウィンドウの中から最も特徴が大きいと考えられる値を拾うため、多少 位置がずれた複数の入力に対しても同じ / 似た 特徴を拾ってくることが期待できる。

むむむ。あながち外れでもないような…。Max Poolingで16x16の領域から最大値を特徴として採用するのかな。元画像が512x512だとすると1/32に圧縮できるわけだから、学習時の負荷が軽くなるよね。


Ir = 0.XXXXXXXXXX

下記、Caffeの出力…lrってなんぞ?学習レートのことか。lr = 0.01から始まって、イテレーション5000の時点でlr = 0.00737788。学習完了時(イテレーション9900)、lr = 0.00596843

I0701 17:20:05.479260 41368 solver.cpp:229]     Train net output #0: loss = 0.00537964 (* 1 = 0.00537964 loss)
I0701 17:20:05.479288 41368 solver.cpp:486] Iteration 5900, lr = 0.0070624

抜粋

For each training iteration, lr is the learning rate of that iteration, and loss is the training function. For the output of the testing phase, score 0 is the accuracy, and score 1 is the testing loss function.


loss = 0.00537964

せっかくなのでlossについても。以下の記述を読む限りコスト関数なのかな。値が小さいほど、よく学習しているってことだと思う。loss = 2.46122から始まって、イテレーション5000の時点でloss = 0.0245493。学習完了時、loss = 0.00441304

抜粋

In Caffe, as in most of machine learning, learning is driven by a loss function (also known as an error, cost, or objective function).

Written with StackEdit.

No comments:

Post a Comment