まんぼう日記

takataka's diary

Caffe の学習済みネットワークを Theano に移して動かす

これまでたかたかは,Theano を使ってちまちまと書いたプログラムで Deep Learning の実験をしてきました.

  1. Convolution Neural Network を含む複雑なネットワークを簡単に書ける.
  2. それを GPU 使ってさくっと動かせる.
  3. Python でプログラムを書くことで,新たなアルゴリズムを簡単に組み込める.しかも GPU も使ってくれる.

ってあたりが Theano を使う理由です.1. と 2. なら Caffe その他いくらでも選択肢がありますが,たかたか的には 3. が重要なので.

 

でも Theano には,overlap pooling すると GPU の性能を活かせなくて遅いという問題がありました(詳しくは Theano の conv2d で subsample を指定すると遅い件 - まんぼう日記 とそのリンク先の記事をどうぞ).また,Caffe のように学習済みのネットワークのパラメータを読み込んで利用する,ということができないのも欠点でした.ところが最近,前者の問題は解決した,もしくはたかたかがちゃんと調べきれてなかっただけ,ということが判明しました:Theano 0.8.0rc1(または,ignore_border は True にしよう) - まんぼう日記 (conv2d で subsample を指定した場合については未検証ですが).

 

とすると,後は後者の欠点さえ補うことができれば無敵です.で,Caffe を使ってみる (2) - まんぼう日記 で Caffe の学習済みネットワークを Python のプログラムで読み込んでテストデータに対する出力を計算させる,という技を身につけたんやから,それを応用すれば….ちうわけで,タイトルのようなことをやってみました.

 

対象にするのは,Caffe を使ってみる (2) - まんぼう日記 で使ったのと同じ,MNIST のデータを学習する CNN です.まず,次のものを用意しておきます.

  • Caffe 用にネットワーク構成を定義したファイル: lenet.prototxt
  • Caffe で学習して得られたパラメータを保存したファイル: lenet_iter_10000.caffemodel

前者は Caffe のインストール先の examples/mnist ディレクトリにあります( こちらにもあり: caffe/examples/mnist at master · BVLC/caffe · GitHub ).後者は,同じディレクトリ内の lenet_train_test.prototxt と lenet_solver.prototxt を使って caffe コマンドで学習を実行して得られたもの.

 

これら 2 つのファイルを読み込んで,このネットワークを Theano で動かせるようにしてみました.できたプログラムはこちら:  ex160324 · GitHub

Caffe の CNN のパラメータを,たかたかが作った Theano 用の CNN のプログラムに渡してます.lenet.prototxt を解析して自動設定,なんちう高度なことはしてませんよ.

 

実行結果はこんなん.

$ python ex160324.py
   :
# fnModel   =  ../160307-caffe/ex160307/lenet.prototxt
# fnTrained =  ../160307-caffe/ex160307/lenet_iter_10000.caffemodel
### Caffe-CNN ###
# data (1, 28, 28)
# conv1 (20, 1, 5, 5) (20,)
# conv2 (50, 20, 5, 5) (50,)
# ip1 (500, 800) (500,)
# ip2 (10, 500) (10,)
### Theano: Conv-Pool-Conv-Pool-ReLu-Softmax
# T4InputLayer:  (1, 28, 28)  dropout =  1.0
# ConvLayer:     (20, 1, 5, 5) (20, 24, 24)  bmode =  valid
# PoolLayer:      ds =  (2, 2)  st =  None  dropout =  1.0 (20, 12, 12) 2880
# ConvLayer:     (50, 20, 5, 5) (50, 8, 8)  bmode =  valid
# PoolLayer:      ds =  (2, 2)  st =  None  dropout =  1.0 (50, 4, 4) 800
# FullLayer:     800 500 ReLu 1.0
# FullLayer:     500 10 linear 1.0
# NT =  10000
### prediction by Caffe-CNN
0.98 %
### prediction by Theano-CNN
0.98 %
# number of inconsistent predictions: 0

 

うまく変換できて,Caffe と Theano の両者でテストした結果はちゃんと一致してます.どうやって変換してるかは,まあソースを見てください.注意が必要なのは,畳み込みのフィルタの値を Numpy array に格納する方法が Caffe と Theano で違ってる,ってとこでしょうか.

 

今度 Caffe | Model Zoo にあるネットワークでも試してみよっと.