2015/10/17

[caffe]自己符号化器だけやってみたい (2)

前回はサンプルのタイトルだけで終わってしまったので、実際にやってみよう。
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
    1. mnist
    2. mnist
    3. conv1
    4. pool1
    5. conv2
    6. pool2
    7. ip1
    8. relu1
    9. ip2
    10. accuracy
    11. loss
  • type
    1. Data
    2. Data
    3. Convolution
    4. Polling
    5. Convolution
    6. Pooling
    7. InnerProduct
    8. ReLU
    9. InnerProduct
    10. Accuracy
    11. 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に、「正規化線形ユニット」とあった。
    • よくわからんが、ボルツマンマシンの章にあるので、後回し
  • Loss layer
    • 最後!
    • ここにSoftmaxが出てくる

 

図にするほどでもないが、こういうことのようだ。

image

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.00601382
I1017 13:41:50.156757 10438 solver.cpp:243] Iteration 9800, loss = 0.0120732
I1017 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.00599102
I1017 13:42:03.945916 10438 solver.cpp:243] Iteration 9900, loss = 0.00437907
I1017 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.00596843
I1017 13:42:17.699626 10438 solver.cpp:468] Snapshotting to binary proto file examples/mnist/lenet_iter_10000.caffemodel
I1017 13:42:17.714552 10438 solver.cpp:753] Snapshotting solver state to binary proto file examples/mnist/lenet_iter_10000.solverstate
I1017 13:42:17.780030 10438 solver.cpp:327] Iteration 10000, loss = 0.0033141
I1017 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.9921
I1017 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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。