学生時代に頑張ったことが何もない

2014-10-10

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

Caffeとは

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

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

Caffeのインストール

公式サイトのインストール手順に従ってインストールします.自分のOSOS 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

おわりに

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

ペンギンペンギン 2014/12/13 22:48 MacOSX10.10でcaffeをビルドしようとしているものです
CPU_ONLYでビルドしようとしています
リンク時にsymbol(s) not found for architecture x86_64と言われビルドが成功しません
opencvやprotobufとのリンクでopencv(protobuf)がlibstdc++でコンパイルされていないのが原因のような気がします
muupanさんはそのようなことは起こらなかったでしょうか
解決方法があればお教えください
よろしくお願いします

muupanmuupan 2014/12/14 00:18 自分の場合もそのような問題が起こりました.Makefileに
CXXFLAGS += -stdlib=libstdc++
LINKFLAGS += -stdlib=libstdc++
という行があるのでこれをコメントアウトすればlibc++を使ってビルドできます.

なお自分の環境ではこうすると今度はgtestを使う箇所で<tr1/tuple>が見つからないというエラーが出るので
CXXFLAGS += -DGTEST_USE_OWN_TR1_TUPLE=1
を追加して最終的にビルドすることができました.

ペンギンペンギン 2014/12/14 00:24 その方法でビルドが通りました
ありがとうございます

ペンギンペンギン 2014/12/14 21:46 たびたび申し訳ありません
ソースコードをコンパイルし実行しようとすると以下のようにことを言われて実行することができません
dyld: Library not loaded: .build_release/lib/libcaffe.so
Referenced from: /Users/penguin/Desktop/./a.out
Reason: image not found
Trace/BPT trap: 5
ソースコードはmuupanさんが書かれている上記のコードと同じものです
何かわかるようでしたらお教えください

turtleturtle 2015/01/03 19:54 CaffeをC++から叩こうとしています
https://gist.github.com/onauparc/dd80907401b26b602885 を参考にC++からpyCaffeでいうpredictをしようとしているのですが、Forwardメンバ関数をやるとsegmenatation faultしてしまいます
環境としてはMacOSX10.10, CPU_ONLYでCUDAを入れていません
CUDAを入れていないのが原因でしょうか?
ご助力お願いいたします

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/muupan/20141010/1412895321
リンク元