前回はサンプルのタイトルだけで終わってしまったので、実際にやってみよう。
Training LeNet on MNIST with Caffe
説明文を日本語訳されているところがあったので、不安があるときは読むとよさそうだ。
が、なるべく英文を読むためにがんばろう、私。
OpenCV 備忘録: CaffeによるMNISTのLeNetの学習を訳してみた
Prepare Datasets
これは、スクリプトを実行して、MNISTのデータを取得するのと、それを解凍するのと、convert_mnist_data.binというのを実行してmnist_train_lmdb/ と mnist_test_lmdb/ を作っている。
中を見ると、*.mdbのファイルができていた。
「えっ、MS Access?」と思ったが、Symas Lightning Memory-Mapped Databaseのことでよいのかな?
バイナリエディタで見たが、JET MDBのフォーマットとは違いそうだ。まあ、ファイルフォーマットを知ってもどうするつもりもないが。
これが準備段階なのだけど、もうtrainもtestもサイズが大きいのでデータが入ってるんじゃないかと思う。
「学習データが入っている」じゃなくて「学習用のデータが入っている」ということか。
Define the MNIST Network
ここからしばらく、lenet_train_test.prototxtの説明が続く。
「MNIST Network」ということで、これがニューラルネットワークの構築に当たるのだろう。
prototxt、という拡張子がニューラルネットワークの設計ファイルになるのか。
と思ったが、lenet_solver.prototxtは構造が全然違う。
こっちは、設定ファイルみたいに見える。
train_lenet.shで使っているのも、このsolver.prototxtだ。
Solverつき
lenet_adadelta_solver.prototxt
lenet_auto_solver.prototxt
lenet_consolidated_solver.prototxt
lenet_multistep_solver.prototxt
lenet_solver_adam.prototxt
lenet_solver.prototxt
lenet_solver_rmsprop.prototxt
lenet_stepearly_solver.prototxt
mnist_autoencoder_solver_adadelta.prototxt
mnist_autoencoder_solver_adagrad.prototxt
mnist_autoencoder_solver_nesterov.prototxt
mnist_autoencoder_solver.prototxt
Solverなし
lenet.prototxt
lenet_train_test.prototxt
mnist_autoencoder.prototxt
うーん。
全部のsolverが設定だけっぽいかというとそうでもなく、lenet_consolidated_solver.prototxtは設計っぽいのも載っている。
まあ、おいおい調べていくとするが、protobufというのに関係しそうなことはわかった。
わからんながら眺めると、
- layerは11個
- name
- mnist
- mnist
- conv1
- pool1
- conv2
- pool2
- ip1
- relu1
- ip2
- accuracy
- loss
- type
- Data
- Data
- Convolution
- Polling
- Convolution
- Pooling
- InnerProduct
- ReLU
- InnerProduct
- Accuracy
- SoftmaxWithLoss
並べてみたら何かわかるかと思ったが、全然わからん。
畳み込み(Convolution)とかプーリング層(Pooling)とかの言葉は聞いたことがあるから、typeは層の種類なのだろう。
Dataが入力で、SoftmaxWithLossは出力なのかな(ソフトマックス関数は、クラス数分の出力を持っていて、そのクラスに属する確率、みたいなものを表す。総和は1)。
LeNet-5は入力層を除いて7層と書いてあったから、「少し変えている」というのはこの辺なのかもしれない(lecun-01a.pdfのp.7の図みたいなのがあるといいのだが・・・)。
と、説明を読み飛ばしていたのだが、prototxtの書き方だけじゃなくてlayerの説明が書いてあった。
- Data layer
- lmdbからデータを読み込む
- 値のレンジは[0, 1)。1.0未満なんだ。。
- 0.00390625 = 1 / 256
- ということは、画素値は0~255のグレースケールということか。
- 255 * 0.00390625 = 0.99609375。ということで、1.0にはならない。
- Convolution layer
- Pooling layer
- まだ勉強してないから、省略
- bottomは入力で、topは出力だと思うけど、再帰するのかな?
- 「深層学習」のp.82の図を見ると、再帰はしないけどconvolutionが2つ並んでいた。
- 6.2章を見ると、畳み込み層とプーリング層はセットだけど、畳み込み層だけ繰り返すこともあるらしい。
- Connected layer
- 「深層学習」では、全結合層
- ReLU layer
- Rectified Linear Unitらしい
- rectified : 整流した
- linear : 線形の
- unit : ユニット
- 「深層学習」のp.150に、「正規化線形ユニット」とあった。
- よくわからんが、ボルツマンマシンの章にあるので、後回し
- Rectified Linear Unitらしい
- Loss layer
- 最後!
- ここにSoftmaxが出てくる
図にするほどでもないが、こういうことのようだ。
accuracy layerはTESTの時だけらしい。
prototxtにincludeが書いてあるものは、そのフェーズでしか使わない、という意味なのだろう。
だから、mnistが2つあっても、phaseに"TRAIN"と"TEST"があるから使い分けられるのだ。
なお「accuracy」は「正確さ」で、100回実施したときの結果になるらしい。
lenet_solver.prototxtに書いてあるらしいが、これか?
test_iter: 100
Training and Testing the Model
lenet_solver.prototxtのsolver_modeをCPUにして、実行。
$ ./examples/mnist/train_lenet.sh
timeコマンドで時間を計ったが、うちの環境では26分くらいかかった。
real 25m52.729s
user 25m44.793s
sys 0m2.958s
うちの環境というのをどう説明したらよいのかわからんが、こんな感じだ。
マシン:AMD Phenom(tm)2 X4 955 3.20GHz RAM:6.00GB
VirtualBox 4.3.30
Host OS : Windows 7 SP1 64bit
Guest OS : Xubuntu 14.04 64bit
メインメモリー:2048MB
プロセッサー数:1
使用率制限:100
lrはleaning rate、lossはtraining function。ふーん。
よくわからんが、最後の方の出力は、こうだった。
I1017 13:41:36.143224 10438 solver.cpp:590] Iteration 9700, lr = 0.00601382I1017 13:41:50.156757 10438 solver.cpp:243] Iteration 9800, loss = 0.0120732I1017 13:41:50.157027 10438 solver.cpp:259] Train net output #0: loss = 0.0120734 (* 1 = 0.0120734 loss)I1017 13:41:50.157097 10438 solver.cpp:590] Iteration 9800, lr = 0.00599102I1017 13:42:03.945916 10438 solver.cpp:243] Iteration 9900, loss = 0.00437907I1017 13:42:03.946504 10438 solver.cpp:259] Train net output #0: loss = 0.0043792 (* 1 = 0.0043792 loss)I1017 13:42:03.946665 10438 solver.cpp:590] Iteration 9900, lr = 0.00596843I1017 13:42:17.699626 10438 solver.cpp:468] Snapshotting to binary proto file examples/mnist/lenet_iter_10000.caffemodelI1017 13:42:17.714552 10438 solver.cpp:753] Snapshotting solver state to binary proto file examples/mnist/lenet_iter_10000.solverstateI1017 13:42:17.780030 10438 solver.cpp:327] Iteration 10000, loss = 0.0033141I1017 13:42:17.780444 10438 solver.cpp:347] Iteration 10000, Testing net (#0)I1017 13:42:26.025928 10438 solver.cpp:415] Test net output #0: accuracy = 0.9921I1017 13:42:26.026139 10438 solver.cpp:415] Test net output #1: loss = 0.0274125 (* 1 = 0.0274125 loss)I1017 13:42:26.026231 10438 solver.cpp:332] Optimization Done.I1017 13:42:26.026285 10438 caffe.cpp:215] Optimization Done.
"after a few minits, you are done!"って書いてあるけど・・・これって最初のログを吐き始めてから数分ってことかしら。
だったら・・・どんだけ速いんですか・・・。
せめて、VirtualBoxじゃなくて、普通に立ち上げたLinuxじゃないとわからんですな。
最終モデルは、lenet_iter_10000、というprotobufファイルに書き込まれるらしい。
うーん、「lenet_iter_10000.caffemodel」のことかな?
同じような名前で「lenet_iter_10000.solverstate」もある。
そして、10000じゃなくて、5000のファイルもある。
https://gist.github.com/rezoo/a1c8d1459b222fc5658f
こちらの「CNNの学習」に、反復回数ごとのスナップショットを撮る、とあった(画像じゃないけど、撮る、でいいや)。
で、solverstateがついている方は学習の再開で使えるらしい。
学習の再開ってなんじゃ?と思ったが、imagenetの学習が3~5日かかる、という恐ろしいことが書かれているので、何かあった場合に再開できるのだろう、きっと。
最終モデルはよいとして、TESTした結果は最後のログでよいのかな?
これだと、accuracyが0.9921なので、認識に99.21%成功した、ということだろうか。
さて、これで畳み込みニューラルネットでやった結果はわかったが、自己符号化器もやっておかねばタイトルから逸れてしまう。
$ time ./examples/mnist/train_mnist_autoencoder.sh
・・・終わらない。
最初にだーっとログが出た後、「data -> data」と出たまま止まっている。
CPU使用率も上がってない。
GPUからCPUには変更してるから、そういうのでもないし。
VirtualBoxを再起動させたが、変わらん。
これかいな?
MNIST Autoencoder Example hangs on data layer lock · Issue #3037 · BVLC/caffe
疲れたから、今回はここまでだ。
ニューラルネットワークの構成をExcelに描いたんだけど、caffe+pythonで出力させることができるらしい。
ノート/Caffeのデモプログラムを試してみる (2014-12-24) - 東邦大学理学部情報科学科 山内のサイト
ほへー。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。