7,052 views
(19) Caffeをインストール で Caffeがインストールできた。
今回は Caffe に付属しているサンプルを使って実際に Caffeを GPU上で動作させてみる。
なんと!
Caffeの実行サンプルには MNIST用トレーニング環境 が付属している。
このサンプルの使用手順は、以下のページに詳しく書かれている。
http://caffe.berkeleyvision.org/gathered/examples/mnist.html

1. MNISTデータをダウンロード
まずはMNISTデータをダウンロードする。
Caffeを GITで取得&展開したディレクトリを CAFFE_ROOT とすれば、
$CAFFE_ROOT/data/mnist
にMNISTデータをダウンロードしておく。
この作業は get_mnist.sh に書かれているので、このスクリプトを実行すればよい。
$ cd $CAFFE_ROOT/data/mnist $ ./get_mnist.sh
自分の作業環境の場合、先に (1) MNIST画像データをダウンロード で同データをダウンロード済みなので、今回この作業はいらない。
2. トレーニング用データを作成
Caffeでは、MNISTデータを Caffeの入力データ形式に変換するプログラムを提供してくれている。
このプログラムの実行は create_mnist.sh に書かれている。
$ cd $CAFFE_ROOT/example/mnist $ ./create_mnist.sh
このスクリプトを実行した結果、以下のように学習データ、テストデータの LevelDB が作られた。
LevelDBは googleが公開している key-value形式の汎用データストアプログラムだ。
$ ls -F | grep / mnist-test-leveldb/ mnist-train-leveldb/
3. トレーニング開始
チュートリアルのページには、超パラメーターの記述方法の説明が書かれている。
これらは後で熟読するとして、まずはトレーニングを実行してみたい。
トレーニング実行は train_lenet.sh に書かれている。
$ cd $CAFFE_ROOT/example/mnist $ ./train_lenet.sh
このスクリプトの中身はこれ(↓)だけ。caffe実行プログラム caffe を起動している。
TOOLS=../../build/tools $TOOLS/caffe train --solver=lenet_solver.prototxt
4. トレーニング実行中
トレーニング実行中はトレースログが表示される。表示内容は以下の通り。
| Iteration N, loss | N batchの学習データの loss function value |
| Iteration N, lr | N batchの learning rate |
| Test score #0 | テストデータの正解率(0.0 ~ 1.0) |
| Test score #1 | テストデータの loss function value |
実際の表示内容はこちら(↓)
I0813 20:23:56.937985 4618 solver.cpp:165] Solving LeNet I0813 20:23:56.937995 4618 solver.cpp:232] Iteration 0, Testing net (#0) I0813 20:23:58.769482 4618 solver.cpp:270] Test score #0: 0.0427 I0813 20:23:58.769534 4618 solver.cpp:270] Test score #1: 2.30319 I0813 20:23:58.802779 4618 solver.cpp:195] Iteration 0, loss = 2.30285 I0813 20:23:58.802830 4618 solver.cpp:365] Iteration 0, lr = 0.01 I0813 20:24:02.135016 4618 solver.cpp:195] Iteration 100, loss = 0.339029 I0813 20:24:02.135049 4618 solver.cpp:365] Iteration 100, lr = 0.00992565 I0813 20:24:05.467381 4618 solver.cpp:195] Iteration 200, loss = 0.172438 I0813 20:24:05.467414 4618 solver.cpp:365] Iteration 200, lr = 0.00985258 I0813 20:24:08.799804 4618 solver.cpp:195] Iteration 300, loss = 0.197514 I0813 20:24:08.799839 4618 solver.cpp:365] Iteration 300, lr = 0.00978075 I0813 20:24:12.132412 4618 solver.cpp:195] Iteration 400, loss = 0.0895801 I0813 20:24:12.132447 4618 solver.cpp:365] Iteration 400, lr = 0.00971013 I0813 20:24:15.431949 4618 solver.cpp:232] Iteration 500, Testing net (#0) I0813 20:24:17.205533 4618 solver.cpp:270] Test score #0: 0.9634 I0813 20:24:17.205569 4618 solver.cpp:270] Test score #1: 0.110554
5. トレーニング終了
付属のMNISTサンプルの繰り返しトレーニング回数は 10,000[batch]だった。※10,000[epoch]ではない!
これは lenet_solver.prototxt の max_iter: 10000 で指定されている。
10,000[batch]終了時の最終結果は以下の通り。
テストデータの正解率は 99.1% と高い!
I0813 20:30:05.385545 4618 solver.cpp:287] Snapshotting to lenet_iter_10000
I0813 20:30:05.389729 4618 solver.cpp:294] Snapshotting solver state to lenet_iter_10000.solverstate
I0813 20:30:05.403728 4618 solver.cpp:213] Iteration 10000, loss = 0.00444134
I0813 20:30:05.403760 4618 solver.cpp:232] Iteration 10000, Testing net (#0)
I0813 20:30:07.157430 4618 solver.cpp:270] Test score #0: 0.9911
I0813 20:30:07.157462 4618 solver.cpp:270] Test score #1: 0.0283371
I0813 20:30:07.157470 4618 solver.cpp:218] Optimization Done.
I0813 20:30:07.157475 4618 caffe.cpp:102] Optimization Done.
Caffeでは繰り返し数をbatch数で指定する(EPOCH数では指定しない)
その理由は、こちらのページでCaffe開発者の方が言及されている。
https://github.com/BVLC/caffe/issues/59

付属のMNIST学習サンプルの場合、繰り返し数は lenet_solver.prototxt の max_iter: 10000で 10000[batch] に設定されている。1バッチの画像データ枚数は lenet_train_test.prototxt の batch_size: 64 で、TRAIN用は 64[images] に設定されている。
このことから…
MNISTの学習用データが 50,000枚 なので、1[epoch]は 50,000 ÷ 64 ≒ 781[batch] となる。
繰り返し回数指定が 10,000[batch] なので、10,000 ÷ 781 ≒ 12[epoch] となる。
※max_iter:10000は、10000epochsではないのだ。