流行りの深層学習フレームワークCaffeをC++から使ってみた

Caffeとは

CaffeはBerkeley Vision and Learning Centerというところが中心となって開発している深層学習(Deep learningフレームワークです.公式サイトの記述によれば

といった特徴があるようです.ちょうどC++から簡単に使える深層学習ライブラリを探していたところ,なんだか流行っていて(Caffeで手軽に画像分類 - Yahoo! JAPAN Tech BlogDeep learning実装の基礎と実践Python - Deep Learningで猫の品種識別 - Qiita)良さそうだったので使ってみることにしました.

Caffeのインストール

公式サイトのインストール手順に従ってインストールします.自分のOSはOS X 10.9.5で,インストール手順には

  • OS X 10.9のデフォルトコンパイラはlibc++を使う
  • でもCUDAは今のところlibstdc++としかリンクできない
  • だから依存ライブラリは全部libstdc++を使ってビルドしろ

とだるいことが書いてありますが,今回は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

おわりに

今回はごく単純なモデルしか扱いませんでしたが,より複雑なモデル(多層,畳み込み+プーリング等)の場合でもC++から扱うインタフェース自体は変わらないものと思います.どうしてもC++から深層学習をした(いけど自分で一から実装はしたくな)い場合は,Caffeを使ってみてはいかがでしょうか.コードが読みやすいところ,Protocol Bufferが書きやすいところも魅力だと思います.