流行りの深層学習フレームワークCaffeをC++から使ってみた
Caffeとは
CaffeはBerkeley Vision and Learning Centerというところが中心となって開発している深層学習(Deep learning)フレームワークです.公式サイトの記述によれば
- 速い("We believe that Caffe is the fastest CNN implementation available")
- GPU(CUDA)を利用できるがCPUだけでも動く
- きれいなアーキテクチャ&読みやすく改変しやすい実装(C++)
- コマンドライン,Python,MATLABインタフェースを提供
- 活発なコミュニティ(Githubのレポジトリやメーリングリストを見るとわかる)
といった特徴があるようです.ちょうどC++から簡単に使える深層学習ライブラリを探していたところ,なんだか流行っていて(Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog,Deep learning実装の基礎と実践,Python - Deep Learningで猫の品種識別 - Qiita)良さそうだったので使ってみることにしました.
Caffeのインストール
公式サイトのインストール手順に従ってインストールします.自分のOSはOS X 10.9.5で,インストール手順には
とだるいことが書いてありますが,今回はCPU-onlyの設定でインストールすることにしていたのでこれは無視してOS X 10.8向けの手順の通りにインストールしました.CPU-onlyの場合はMakefile.configのCPU_ONLY := 1の行をアンコメントします.
CaffeをC++から使う
以下,$HOME/caffe以下にインストールしたとして話を進めます.Caffeをライブラリとして別のC++プログラムから利用するという利用方法は,公式にサポートされた方法ではないようで,ほとんど情報がありません.GithubのIssuesやメーリングリストを検索したりtools/caffe.cpp等のコードを参考にした結果,以下のようなごくシンプルなモデル(入力が2変数,出力が1変数の線形近似)でひとまず学習を行うことができました.
net.prototxtではネットワークのアーキテクチャと損失の定義をしており,solver.prototxtでは損失を最小化する最適化アルゴリズムの設定をしています.詳しくは公式のチュートリアルを見てください.
上のC++コード(caffe-sample.cpp)をコンパイルするには,次のようにします.
$ clang++ -std=c++11 -DCPU_ONLY -I$HOME/caffe/include -I/System/Library/Frameworks/vecLib.framework/Versions/Current/Headers -L$HOME/caffe/build/lib caffe-sample.cpp -lcaffe -lglog
(CPU-onlyの場合は)-DCPU_ONLYを指定すること,Caffeのヘッダファイルへのパス($HOME/caffe/include)と共有ライブラリへのパス($HOME/caffe/build/lib)を通すことが必要です.さらにOS Xでは/System/Library/Frameworks/vecLib.framework/Versions/Current/Headersのヘッダファイルへのパスが必要なようです(Makefile参照).さらに,$HOME/caffe/include/caffe/proto/caffe.pb.hが見つからないとエラーが出る場合は,$HOME/caffe/src/caffe/proto/caffe.protoに対してprotocコマンドを使って作成します.
# $HOME/caffe/include/proto以下にcaffe.pb.hとcaffe.pb.ccが作成される $ protoc $HOME/caffe/src/caffe/proto/caffe.proto --cpp_out=$HOME/caffe/include/proto
実行結果は以下のようになり,バイアスを含めた3つのパラメータをそれなりに正しく学習できているのが確認できます.
$ ./a.out 3.00199x + -1.99783y + 3.99781 = target 10a + 20b + c = -5.93897