Caffeがはやっている。
画像認識系のDeep learning をするときにいい。というのはこちらに書いてある。
環境は ubuntu 14.04
GPUはない!!
インストールはこちらやこちらを参考にコピペするだけ。
ハマったことその1:CPUモード
CaffeはGPUがないボンビーについてもCPUだけで計算してくれる心優しいモードがある。その場合はコンパイルのときに Makefile.config を
# CPU_ONLY := 1 ↓ CPU_ONLY := 1
としてからmake することでCPUだけしかない環境でもできるようになる。その後、make runtest でエラーがなければCPUだけでも画像認識ができる。
やったねたえちゃん! 技能が増えるよ!!
…
!?!?!?
build/tools/caffe train --solver examples/cifar10/cifar10_quick_solver.prototxt I0708 13:22:18.238294 20267 caffe.cpp:113] Use GPU with device ID 0 F0708 13:22:18.238533 20267 common.cpp:55] Cannot use GPU in CPU-only Caffe: check mode. *** Check failure stack trace: *** @ 0x7f4aa2286daa (unknown) @ 0x7f4aa2286ce4 (unknown) @ 0x7f4aa22866e6 (unknown) @ 0x7f4aa2289687 (unknown) @ 0x7f4aa25b1330 caffe::Caffe::SetDevice() @ 0x406312 train() @ 0x404901 main @ 0x7f4aa1798ec5 (unknown) @ 0x404ead (unknown) @ (nil) (unknown) 中止 (コアダンプ)
解決法
cifar10_quick_solver.prototxt 内のモードも変更する。
# solver mode: CPU or GPU solver_mode: GPU ↓ solver_mode: CPU
ハマったことその2:mean.binaryproto
F0708 14:37:40.652281 20928 io.cpp:52] Check failed: fd != -1 (-1 vs. -1) File not found: examples/cifar10/mean.binaryproto *** Check failure stack trace: *** @ 0x7fdf95121daa (unknown) @ 0x7fdf95121ce4 (unknown) @ 0x7fdf951216e6 (unknown) @ 0x7fdf95124687 (unknown) @ 0x7fdf9546e263 caffe::ReadProtoFromBinaryFile() @ 0x7fdf954833ba caffe::DataTransformer<>::DataTransformer() @ 0x7fdf954be018 caffe::BaseDataLayer<>::LayerSetUp() @ 0x7fdf954be0f9 caffe::BasePrefetchingDataLayer<>::LayerSetUp() @ 0x7fdf95495532 caffe::Net<>::Init() @ 0x7fdf95496ff2 caffe::Net<>::Net() @ 0x7fdf954a2310 caffe::Solver<>::InitTrainNet() @ 0x7fdf954a32b3 caffe::Solver<>::Init() @ 0x7fdf954a3486 caffe::Solver<>::Solver() @ 0x40c3d0 caffe::GetSolver<>() @ 0x406371 train() @ 0x404901 main @ 0x7fdf94633ec5 (unknown) @ 0x404ead (unknown) @ (nil) (unknown) 中止 (コアダンプ)
解決策
create_cifar10.sh を一度実行してmean.binaryproto を作っておかないといけない。
ハマったことその3:LMDBとleveldb
データを参照するにあたってleveldb というものが作られるらしいが、
cifar10_quick_train_test.prototxt を修正する。こちらからパクった。
name: "CIFAR10_quick" layer { name: "cifar" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { mean_file: "examples/cifar10/mean.binaryproto" } data_param { source: "examples/cifar10/cifar10_train_leveldb" ← ココ batch_size: 100 backend: LEVELDB ← ココ } } layer { name: "cifar" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { mean_file: "examples/cifar10/mean.binaryproto" } data_param { source: "examples/cifar10/cifar10_test_leveldb" ← ココ batch_size: 100 backend: LEVELDB ← ココ } }
ハマったことその4:num_output
判別するカテゴリ数を変えるには、cifar10_quick_prototxt のip2 layer にある num_output の数を変更する必要がある。
というわけでカテゴリを2とか3とか、任意に変えてみると
Check failed: ShapeEquals(proto) shape mismatch (reshape not set)
!?!?!?!
解決策
cifar10_quick_train_test.prototxt のip2 layer にある num_output も同様に変更しなければならない。
困っている人はそこそこいるらしい。