読者です 読者をやめる 読者になる 読者になる

モノクロタイム

I'm from the future!

Caffeを使用した精度向上のためのアプローチ

こんにちは,れいじです.

現在パシフィコ横浜で開催されているSSII2015という学会に参加しています.

明日にポスター発表を控えています.緊張してます.

SSII2015 第21回画像センシングシンポジウム

チュートリアルセッションでDeepLearningの話題があったのですが,内容がフムフムなるほど〜〜〜って感じでタメになったので忘れない内にメモしておこうと思います

スライドシェアにスライドが上がっているらしいのですが見つけられない…

Caffeとは

Caffeというのは画像認識に特化したオープンソースのDeepLearningライブラリです.

Caffe | Deep Learning Framework

このブログでもインストールの仕方を色々と解説した記事を書いています

reiji1020.hatenablog.com

reiji1020.hatenablog.com

Caffeがどういったものであるかとか,そもそもDeepLearningがどういったものであるかとかはスライドシェアなりブログなり漁ると結構色々記事が出てくると思います.

Caffeを適用する前に考えること

そもそも自分が達成したいタスクがDeepLearningで解決できるものかどうかという事を考えることが重要です.

  • ImageNetの学習済みモデルをつかってFine-Tuningができそうなタスクであるか

  • 手元に学習に使用できるサンプルが大量に用意できているか

以上2つのどちらかを満たしていなければDeepLearningは諦めたほうがいいようです.

なんでもDeepLearningで解決〜みたいな流れになっていますが,適用するタスクを選ぶことは重要ですね.

Caffeを使用して学習を進める時に気をつけるべきこと

DeepLearningの精度向上に関して重要になるべきパラメータはズバリ学習率

Bengio先生もこれから集中して頑張るとすれば学習率の見極めと仰るほど重要なパラメータです.

Caffeの中で学習率に相当するパラメータがどれかというと

net: "models/bvlc_reference_caffenet/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr: 0.01 <-これ
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 450000
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train"
solver_mode: GPU

いろんな解説ページでもbase_lrは必ず変更しましょうと書いてありますね.

ただ最適な学習率を見つけ出すのは本当に難しいので,Caffeのチュートリアルのprototxt引用しとこうみたいな感じだと思います.それでも大体学習できますからね.

学習率が大きすぎる場合

Caffeを使用して学習を回すと予測誤差と訓練誤差がセットになって出てきますが,

I0813 20:23:56.937995  4618 solver.cpp:232] Iteration 0, Testing net (#0)
I0813 20:23:58.769482  4618 solver.cpp:270] Test score #0: 0.0427 <-予測誤差
I0813 20:23:58.769534  4618 solver.cpp:270] Test score #1: 2.30319
I0813 20:23:58.802779  4618 solver.cpp:195] Iteration 0, loss = 2.30285 <-訓練誤差

この訓練誤差が一向に減らない場合,学習自体が破綻している可能性があります.

問題解決の為には,学習率を減らしてやる必要があります.

学習率が大きすぎると,

  • すぐに精度が頭打ちになる

  • 突然学習が破綻する

などの問題が起きるみたいです.

逆に学習率が小さすぎると,いい線までいくが時間がかかりすぎてしまうとのこと.

学習精度をグラフにして逐一確認しながら学習率を変化させてやるのがベストな方法みたいです.

過学習が起きている場合

過学習が起きるということは,訓練誤差は着実に減るが予測誤差が大きい場合を指します.

これを解決するためにはdropoutの数を増やしたりネットワークそのものを小さくすることで問題解決ができます.

dropoutについてはこちらのブログが参考になります

olanleed.hatenablog.com

訓練誤差と予測誤差が殆ど変わらない場合

モデルの表現能力が低いために起こる問題です.非常に惜しい状態なので,ネットワークを大きくしたりニューロン数を増やすことで精度向上に繋がります.

Caffeを使う以外にやっておくこと

散々言われていることですが,学習データの前処理が非常に重要です.特にコントラスト正規化はきちんとやっておくと吉だと思います.

CNNは平行移動に強い不変性を持ちますが,逆に回転に弱いです.各学習データにアフィン変換やクロップなどを施したデータを入れると良いです.

急ぎで書きましたが,とりあえずこれだけメモっておきます.

ではでは!