Caffeを使うときにハマったこと

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 も同様に変更しなければならない。
困っている人はそこそこいるらしい。