これまでたかたかは,Theano を使ってちまちまと書いたプログラムで Deep Learning の実験をしてきました.
- Convolution Neural Network を含む複雑なネットワークを簡単に書ける.
- それを GPU 使ってさくっと動かせる.
- 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 にあるネットワークでも試してみよっと.