まんぼう日記

takataka's diary

Caffe を使ってみる (3)

Caffe を使ってみる - まんぼう日記Caffe を使ってみる (2) - まんぼう日記 のつづき.CNN を定義する prototxt ファイルを Python のプログラムで生成する話と,Python のプログラムでCNNの学習を実行する話です.こちらの記事を大いに参考にさせてもらいました:  Deep learning tutorial on Caffe technology : basic commands, Python and C++ code.

 

 

 

CNN を定義する prototxt ファイルを Python のプログラムで生成する

前回使った,examples/mnist/ にある lenet_train_test.prototxt および lenet.prototxt で定義してるのと同じ CNN を定義する prototxt ファイルを Python のプログラムで生成してみることにしました.上記サイト

https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto

の記述を参考に作ったプログラムがこちら: makenet160310.py · GitHub

 

実行すると,ex160310[LVT].prototxt という3つのファイルが出力されます.L が学習のため,V が学習途中にテストデータを読み込んで評価するため,T が学習後のネットワークに任意のデータを食わせて出力を計算するため,のものです. lenet_train_test.prototxt のように一つのファイルの中に phase: TRAIN な部分と phase: TEST な部分を両方書けば L と V を一つにできたんですが,Python のプログラムで実現する方法がわからなかったのでとりあえずこんなことに.

 

ex160310[LV].prototxt と上記のプログラムと同じ所に置いてある ex160310_solver.prototxt · GitHub の計3つのファイルを使えば,

$ caffe  train  --solver=ex160310_solver.prototxt

のように caffe コマンドで学習を実行することができます.結果は当然 Caffe を使ってみる - まんぼう日記 と同じ.

 

Python のプログラムでCNNの学習を実行する

次は,Python のプログラムで ex160310_solver.prototxt を読み込んで学習させてみます.プログラムはこんなんなりました:  solver160310.py · GitHub

 

上記リンク先のプログラムでは solver.step( 100 ) を繰り返し呼ぶようにしてますが,コメントにしてある solver.solve() を呼べば ex160310_solver.prototxt に記述した max_iter の回数分勝手に繰り返してくれます.作ってるうちに気づいた注意点をいくつか:

  • solver.step() の引数はその呼び出しで何ステップ分の学習を進めるかを表す.solver.step( 100 ) ならミニバッチ100個分.
  • solver.prototxt に書いた solver_mode: の記述は無視されてしまうので,上記プログラムのように caffe.set_mode_gpu() しないといけない
  • solver.prototxt に書いた max_iter: も無視される.上記プログラムを実行するとわかるように,max_iter を越えてもそのまま学習が進められる.

 

今日のところはこの辺で.次の目標は自分で Layer 定義して自由に使えるようになることですが,これはかなり手強そう…まあぼちぼち.