読者です 読者をやめる 読者になる 読者になる

まんぼう日記

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 にあるネットワークでも試してみよっと.