##環境
Dockerで新しく作成したUbuntuコンテナ
-
CentOS release 6.6
- Docker version 1.3.2, build 39fa2fa/1.3.2
- Ubuntu 14.04
- Docker version 1.3.2, build 39fa2fa/1.3.2
-
Caffe 3e12d49324793d4798ee10bb6ef6a1c1b7633baf (
git log | head -n 1
) -
Pylearn2 9870dec593c71c194ebc2044973f65acc32c8675
##Docker Hub
とりあえずお試しで使ってみたいという方に向けて、Caffe(python wrapper含む), Pylearn2のそれぞれの環境構築を行ったDockerコンテナをDocker Hubに公開しました。
詳細はリポジトリのInformationをご参照下さい。
Caffe
# docker pull cordea/pycaffe
この記事で言うと"make"まで終了している状態のコンテナです。
Pylearn2
# docker pull cordea/pylearn2
"path"まで終了している状態のコンテナです。
#共通
Create user
rootでもいいって人は飛ばして下さい。
# username="your user name"
# adduser --disabled-password --gecos '' $username
# adduser $username sudo
# echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# su $username
基本だけとりあえずinstall
他にも共通のパッケージはありますが...
$ sudo apt-get update
$ sudo apt-get install python vim git wget
#Caffe
今回は CPUモード で動作させるため、NVIDIA Graphics Driverはインストールしません。
Installation
$ sudo apt-get install make bc libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libblas-dev libatlas-base-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler libsvm-dev libsvm3 libsvm-tools
PyCaffe
Anaconda Pythonが推奨されていますがLinuxだと面倒なのはどちらでも変わらないので今回は使いません。
公式の通りpip
で入れるなら (おそらく追加でgfortran
のinstallが必要です)
$ sudo apt-get install python-pip
$ cd ~/caffe/python/
$ for req in $(cat requirements.txt); do sudo pip install $req; done
出来るだけapt-get
で管理したいなら
$ sudo apt-get install python-pip python-scipy python-matplotlib python-scikits-learn ipython python-h5py python-leveldb python-networkx python-nose python-pandas python-dateutil python-protobuf python-yaml python-gflags python-skimage cython
CUDA
$ cd ~
$ cd
$ chmod u+x cuda_6.5.14_linux_64.run
$ ./cuda_6.5.14_linux_64.run
Do you accept the previously read EULA? (accept/decline/quit): accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 340.29? ((y)es/(n)o/(q)uit): n
Install the CUDA 6.5 Toolkit? ((y)es/(n)o/(q)uit): y
Enter Toolkit Location [ default is /usr/local/cuda-6.5 ]:
/usr/local/cuda-6.5 is not writable.
Do you wish to run the installation with 'sudo'? ((y)es/(n)o): y
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y
Install the CUDA 6.5 Samples? ((y)es/(n)o/(q)uit): n
Installing the CUDA Toolkit in /usr/local/cuda-6.5 ...
===========
= Summary =
===========
Driver: Not Selected
Toolkit: Installed in /usr/local/cuda-6.5
Samples: Not Selected
$ sudo ldconfig /usr/local/cuda-6.5/lib64/
$ rm cuda_6.5.14_linux_64.run
###make
$ git clone https://github.com/BVLC/caffe
$ cd caffe/
$ cp Makefile.config.example Makefile.config
$ echo "CPU_ONLY := 1" >> Makefile.config # 1/26 追記
$ make all
$ make test
$ make runtest
...
[----------] Global test environment tear-down
[==========] 457 tests from 98 test cases ran. (14811 ms total)
[ PASSED ] 457 tests.
##Tutorial
$ vim examples/mnist/lenet_solver.prototxt
$ ./data/mnist/get_mnist.sh
$ ./examples/mnist/create_mnist.sh
$ ./examples/mnist/train_lenet.sh
##PyCaffe Tutorials
Caffeで手軽に画像分類に従ってTutorialを行います。
$ cd ~/caffe/examples/imagenet/
$ wget https://raw.githubusercontent.com/sguada/caffe-public/master/models/get_caffe_reference_imagenet_model.sh
$ chmod u+x get_caffe_reference_imagenet_model.sh
$ ./get_caffe_reference_imagenet_model.sh
$ cd ~/caffe/data/ilsvrc12/
$ ./get_ilsvrc_aux.sh
$ cd ~/caffe/
$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
$ tar xzvf 101_ObjectCategories.tar.gz
$ echo "export PYTHONPATH=$HOME/caffe/python:$PYTHONPATH" >> ~/.bashrc
$ source ~/.bashrc
###実行
####リファレンスモデルでの分類
$ cd ~/caffe/python/
$ python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy
上のリンクに従ってshow_result.py
を作成し、実行します。
$ cd ~/caffe/
$ python show_result.py data/ilsvrc12/synset
synset_words.txt synsets.txt
$ python show_result.py data/ilsvrc12/synset_words.txt result.npy
#1 | n04552348 warplane, military plane | 84.8%
#2 | n04008634 projectile, missile | 5.5%
#3 | n02690373 airliner | 5.1%
#####classify.pyでエラーが出た場合
numpyのioとPyCaffeのio.pyが競合するようです。(Strange Issue using Python #782)
$ python classify.py --raw_scale 255 ~/caffe/101_ObjectCategories/airplanes/image_0001.jpg ../result.npy
Traceback (most recent call last):
File "classify.py", line 7, in <module>
import numpy as np
...
File "/usr/local/lib/python2.7/dist-packages/skimage/util/dtype.py", line 8, in <module>
dtype_range = {np.bool_: (False, True),
AttributeError: 'module' object has no attribute 'bool_'
無理やりな方法ですがio.py
をcaffe_io.py
にrenameします。
ここでrenameした場合には、次の"Caffeを特徴抽出器として使った分類"に作成するfeature.py
でもrenameする必要があります。
$ cd ~/caffe/python/
$ aftfile="caffe_io"
$ for file in `find . -name "*.py"`; do; cat $file | sed -e "s/import [\w\.]*io/import $aftfile/g" | sed -e "s/caffe\.io/caffe\.$aftfile/g" > $file".tmp";mv $file".tmp" $file; done
$ mv "caffe/io.py" "caffe/"$aftfile".py"
####Caffeを特徴抽出器として使った分類
前のブランチに切り替えたまま戻すのをすっかり忘れていたので、もしかしたら少し違う部分があるかもしれません。
$ cd ~/caffe
$ cp examples/imagenet/imagenet_deploy.prototxt examples/imagenet/imagenet_feature.prototxt
$ vim examples/imagenet/imagenet_feature.prototxt
次のようにimagenet_feature.prototxt
を変更して下さい。
...
154 top: "fc6wi"
...
162 bottom: "fc6wi"
...
deeplearning-tutorials
libsvm formatで特徴量を並べたファイルを作成します。
$ cd ~/caffe/
$ git clone https://github.com/CORDEA/deeplearning-tutorials
$ mv ~/caffe/deeplearning-tutorials/caffe/feature.py ~/caffe/
$ python feature.py
もしくは
$ cd ~/caffe/
$ wget https://raw.githubusercontent.com/CORDEA/deeplearning-tutorials/master/caffe/feature.py
$ python feature.py
train
commandはsvm-train
に
predict
commandはsvm-predict
に
それぞれ名前が変わっていますので注意して下さい。
$ svm-scale -s scale.txt train.txt > train_scaled.txt
$ svm-scale -r scale.txt test.txt > test_scaled.txt
$ svm-train -c 0.03 train_scaled.txt caltech101.model
####Fine tuning
必要なファイルを用意します。
"Caffeを特徴抽出器として使った分類"でgit clone
した場合
$ cd ~/caffe/
$ mv ~/caffe/deeplearning-tutorials/caffe/fine_tuning.py ~/caffe/
$ python fine_tuning.py
wgetする場合
$ cd ~/caffe/
$ wget https://raw.githubusercontent.com/CORDEA/deeplearning-tutorials/master/caffe/fine_tuning.py
$ python fine_tuning.py
convert_imageset.bin
の仕様が変わっているので参考記事の通りでは動作しません。
参考記事で指定されているflagの1
が現在のどれに当たるかわかりませんが、おそらく-gray
だろうと判断して進めています。
$ build/tools/convert_imageset.bin -gray -resize_width 256 -resize_height 256 101_ObjectCategories/ train.txt caltech101_train_leveldb
$ build/tools/convert_imageset.bin -gray -resize_width 256 -resize_height 256 101_ObjectCategories/ val.txt caltech101_val_leveldb
$ build/tools/compute_image_mean.bin caltech101_train_leveldb caltech101_mean.binaryproto
参考記事から参照先が変わっていますので気をつけて下さい。
$ cp ~/caffe/models/bvlc_reference_caffenet/*.prototxt ~/caffe/
$ cd ~/caffe/
$ sed -i -e 's/fc8/fc8ft/g' train_val.prototxt deploy.prototxt
以下の部分をエディタ(viとか)で変更して下さい。
1 net: "train_val.prototxt"
...
4 base_lr: 0.001
...
14 solver_mode: CPU
8 source: "caltech101_train_leveldb"
9 backend: LEVELDB
...
14 mean_file: "caltech101_mean.binaryproto"
...
25 source: "caltech101_val_leveldb"
26 backend: LEVELDB
...
31 mean_file: "caltech101_mean.binaryproto"
...
321 num_output: 102
5 input_dim: 256
6 input_dim: 256
...
204 num_output: 102
$ build/tools/caffe train -solver solver.prototxt
#Pylearn2
Installation
$ sudo apt-get install python-setuptools python-pip python-dev python-numpy python-scipy python-yaml python-matplotlib liblapack-dev python-nose2 cython
$ sudo pip install theano
$ cd ~
$ git clone https://github.com/lisa-lab/pylearn2.git
$ cd pylearn2
$ sudo python setup.py develop
path
$ echo "export PATH=$HOME/pylearn2/pylearn2/scripts/:$PATH" >> ~/.bashrc
$ echo "export PYLEARN2_DATA_PATH=$HOME/.data/lisa/data" >> ~/.bashrc
$ source ~/.bashrc
##Tutorials
Gaussian-Bernoulli RBM examples using CIFAR10
$ cd ~/pylearn2/pylearn2/scripts/datasets/
$ ./download_cifar10.sh
$ cd ~/pylearn2/pylearn2/scripts/tutorials/grbm_smd/
$ python make_dataset.py
$ train.py cifar_grbm_smd.yaml
$ show_weights.py cifar_grbm_smd.pkl --out weights_result.png # GUIがある場合は --out は無くても良い
$ plot_monitor.py cifar_grbm_smd.pkl --out monitor_result.png
Put e, b, s or h in the list somewhere to plot epochs, batches, seconds, or hours, respectively.
Enter a list of channels to plot (example: A, C,F-G, h, <test_err>) or q to quit or o for options: b,L,M
set x_axis to example
A. bias_hid_max:cifar_grbm
B. bias_hid_mean:cifar_grbm
C. bias_hid_min:cifar_grbm
D. bias_vis_max:cifar_grbm
E. bias_vis_mean:cifar_grbm
F. bias_vis_min:cifar_grbm
G. h_max:cifar_grbm
H. h_mean:cifar_grbm
I. h_min:cifar_grbm
J. learning_rate:cifar_grbm
K. objective:cifar_grbm
L. reconstruction_error:cifar_grbm
M. total_seconds_last_epoch:cifar_grbm
N. training_seconds_this_epoch:cifar_grbm
Put e, b, s or h in the list somewhere to plot epochs, batches, seconds, or hours, respectively.
Enter a list of channels to plot (example: A, C,F-G, h, <test_err>) or q to quit or o for options: q
####imageの確認
dockerで動作させている場合
docker cp
でlocalにcopyしてるだけ
% container="pylearn2" # Enter the container ID or name
% for file in `echo weights_result.png monitor_result.png`;do;docker cp $container:/home/cordea/pylearn2/pylearn2/scripts/tutorials/grbm_smd/$file /host/path/to/dir/;done
% open *.png # for Mac
SdA examples using MNIST
$ cd ~/pylearn2/pylearn2/scripts/datasets/
$ python download_mnist.py
$ cd ~/pylearn2/pylearn2/scripts/tutorials/stacked_autoencoders/tests
$ python test_dae.py
自分の用意したデータを使う
csvをそのまま使用するならこちらが参考になります。
今回はcsvからpklを作成する方法を紹介します。
画像をresize, gray-scale化した上でcsvに変換します。
$ cd ~
$ git clone https://github.com/CORDEA/deeplearning-tutorials.git
$ cd deeplearning-tutorials/pylearn2
$ mkdir in
convertImage.py
は以下の様なディレクトリ構造を想定して作成しています。
ディレクトリ名をラベル情報として下さい。
.
├── convertImage.py
├── in
├── hoge # label name
| ├── hogehoge.png
| ...
|
├── huge
| ├── hugehuge.png
| ...
...
$ python convertImage.py
作成したtrain.csv
をpklファイルにします。
$ python createpkl.py
train.pkl
を~/pylearn2/pylearn2/scripts/tutorials/
のサンプルを参考にして使用すれば使えるかと思います。
###例
クラス数は10として例示します。
$ cd ~/pylearn2/pylearn2/scripts/tutorials/dbm_demo/
$ cp ~/deeplearning-tutorials/pylearn2/train.pkl ./
13,21c13
< dataset: &data !obj:pylearn2.datasets.binarizer.Binarizer {
< # We use the "raw" tag to specify the underlying dataset defining
< # the sampling probabilities should be MNIST.
< raw: &raw_train !obj:pylearn2.datasets.mnist.MNIST {
< which_set: "train",
< start: 0,
< stop: %(train_stop)i
< }
< },
---
> dataset: !pkl: "train.pkl",
22 hyper_params = {'detector_layer_dim': 10,
$ python train_dbm.py rbm.yaml
$ show_weights.py dbm.pkl --out figure.png
####エラー
794 raise TypeError(Cannot safely cast batch dtype %s to space's dtype %s. % (batch.dtype, self.dtype))
ここでエラーが出たのですが、データの方を弄ってもいまいち上手く行かなかったので
794 # raise TypeError("Cannot safely cast batch dtype %s to "
795 print "Might not be safely cast batch dtype %s to space's dtype %s." \
796 % (batch.dtype, self.dtype)
98 try:
99 print "Run the conversion to int64 from %s" % (targets.dtype)
100 targets = np.array([[int(r) for r in label] for label in targets])
101 except:
102 raise TypeError("need an integer array for targets, %s" % (targets.dtype))
今のところこんなかんじで無理やり動かしています...
お疲れ様でした。