下丸子のコネクショニスト

機械学習、人工知能などの話題について触れます。

CaffeでMNISTを学習した経過をプロットしてみた

今回は

1. CaffeでMNISTを学習

2. 学習中に精度が上がっていく様子をプロット

することを目標にする。

 

実験で使う環境などについては、下記をご参照ください。

【メモ書き】Ubuntu 14.04 CUDA6.5 GTX970 Caffeインストール - 下丸子のコネクショニスト

 

MNISTの学習

以降はMNISTを学習する際の手順を示す。

進め方はCaffe | LeNet MNIST Tutorialを参考にした。

 

MNIST(http://yann.lecun.com/exdb/mnist/)はLeCunらが作成した手書き文字データセットで、様々な人間が書いた1~10の数字をコンピュータに分類させるタスクとして取り組まれている。

例えば0が書かれた画像を一覧にすると、以下のようになる。

一人一人が書く文字の見た目は多様なため、多様さを吸収するようなアルゴリズムが必要なタスクになっている。

f:id:yukisaito:20150316100113j:plain

(引用:http://www.cs.nyu.edu/~roweis/data.html)

 

まずはMINISTのデータを取得する。

Caffeのディレクトリに移動し、下記を実行した。

./data/mnist/get_mnist.sh

./examples/mnist/create_mnist.sh

 

今回はLeNetを用いることにする。

modelディレクトリにLeNetのprototxtをコピーした。

このあたりは筆者の好みになっている。

mkdir model/mnist

cp example/mnist/lenet_solver.prototxt model/mnist/

cp example/mnist/lenet_train_test.prototxt model/mnist/

ここでコピーしたlenet_solver.prototxtの二行目を下記のように変更した。

net: "models/mnist/lenet_train_test.prototxt"

 

あとはいつも通り、下記のコマンドを実行して学習を開始する。

./build/tools/caffe train --solver=models/mnist/lenet_solver.prototxt

 

精度のプロット

Caffeは学習時にログファイルを出力しており、今回はこのログファイルを使って精度のプロットを行う。

ログファイルは/tmp/フォルダに格納されている。

ファイル名は環境依存になっており、

/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

のようになるらしい。

(出典:https://groups.google.com/forum/#!msg/caffe-users/CqejrkmTOx0/3wqz7wnwCLkJ

 

例えば私の場合は

/tmp/caffe.<hostname>.<user name>.log.INFO.20150316-085258.3732

のような感じになっていた。

なお、ログファイルは順次消えてしまうようなので注意が必要である。

 

精度をプロットするのに、今回はあらかじめ用意されたプログラムを用いることにする。

下記のコマンドを実行した。

cd tools/extra

./parse_log.sh 上記のログファイルを引数として入力

これにより、tools/extraログファイル名.trainおよびログファイル名.testというファイルが出力される。

これらのファイルを、それぞれmnist.log.trainおよびmnist.log.testにリネームしておく。

 

以降の処理では、gnuplotが必要になる。

下記のようにインストールを行った。

sudo apt-get install gnuplot

 

まず、学習途中の精度をプロットしてみた。

事前に用意されたプログラムに誤植があるため、下記のように訂正した。

plot_log.gnuplot.exampleの42, 43行目を

set xlabel "Training loss"
set ylabel "Training iterations"

から

set ylabel "Training loss"
set xlabel "Training iterations"

に変更した。

下記のコマンドを実行すると、以下のyour_chart_name.pngが出力された。

gnuplot plot_log.gnuplot.example

f:id:yukisaito:20150316103914p:plain

x軸は学習のiteration数、y軸はlossである。

lossが一気に低減され、以降0に近づいていく様子が分かる。

 

次にテスト時の精度をプロットする。

実は、parse_log.shは現行バージョンのCaffeが出力するログ形式に完全に対応している訳ではなく、mnist.log.testにIterationのデータが出力されていない。

そこで今回は仕方なく、テスト時のプロットには学習時間を横軸に用いることにした。

 

plot_log.gnuplot.exampleの末尾に下記の行を加え、

# Test accuracy vs. training time
set ylabel "Test accuracy"
set xlabel "Training time"
plot "mnist.log.test" using 1:2 title "mnist"

さらに41~44行目をコメントアウトした(行頭に#をつける)。

先ほどと同等に下記のコマンドを実行すると、以下のyour_chart_name.pngが出力された。

gnuplot plot_log.gnuplot.example

f:id:yukisaito:20150316104803p:plain

学習のlossと同じように、テスト画像を用いて評価したaccuracyも急激に上昇していることが分かる。なんだこれ…。

 

おわりに

今回はLeNetを用いてMNISTを学習し、精度をプロットした。

プロットした結果、精度が急激に向上していることが分かった。

ぶっちゃけ異常な上昇である。

おそらく、LeNetのアーキテクチャおよび様々なパラメータがMNISTに適合していると考えられる。初期値依存性がどのようになっているか気になるところである。

 

今回はここまで。