おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

Caffeのsolverの設定

Caffeで学習する際のsolverの設定は[modelName]_solver.prototxtみたいな名前のファイルを作り、そこに書く。
例:caffe/lenet_solver.prototxt at master · BVLC/caffe · GitHub
以下で設定できるパラメータについて説明する。

全般

  • net: "lenet_train_test.prototxt"

学習時に使うネットワークが書かれたファイル名

  • solver_mode: CPU or GPU

学習の際にCPUを使うかGPUを使うか

更新の回数関連

テストの際に、何回forward処理を行うか。
test_iter(solver) * batch_size(TEST用data Layer)の数だけのデータに対してテストが行えるので、テスト用データ数/batch_sizeに設定するとよい

  • test_interval: 500

何回のパラメータの更新ごとにテストを実行するか

  • display: 100

何回の更新ごとに学習データに対する結果を表示するか

パラメータの更新を何回行うか

  • snapshot: 5000

学習したパラメータを何回ごとに保存するか。

  • snapshot_prefix: "examples/mnist/lenet"

学習したパラメータを保存する際のファイルの名前の

最適化手法関連

Caffe | Solver / Model Optimizationが参考になる。

  • type: "SGD" or "Adam" etc

最適化のアルゴリズムの種類

  • base_lr: 0.01

学習率(のベースの値)実際の学習率は下ででてくるlr_policyに依存する。

  • momentum: 0.9

上に挙げたサイトのμのこと。typeが"SGD"でも存在する。

  • weight_decay: 0.0005

上に挙げたサイトのλのこと。過学習を防ぐために使う。
学習データが十分に多く、パラメータが少ない時(過学習が起こりにくい)は小さめに、パラメータが多く、学習データが少ない時(過学習が起こりやすい)は大きめにする。
machine learning - What is `weight_decay` meta parameter in Caffe? - Stack Overflow

学習率の更新関連
  • lr_policy: "fixed" or "inv" etc

fixed: 常にbase_lrを使う
step: base_lr * gamma ^ (floor(iter / step))。stepsizeごとにbase_lrをgamma倍する
exp: base_lr * gamma ^ iter。"step"の連続版(つまり、毎ステップlrを変える)
multistep: stepと基本は同じだが、一定のstepごとに学習率を変えるのではなくて、stepvalueで決められた値ごとに変える。
inv: base_lr * (1 + gamma * iter) ^ (- power). べき減衰
poly: base_lr * (1 - iter/max_iter) ^ (power), 名前のとおりべきで、max_iterでゼロになる
sigmoid: base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
f:id:nohzen:20170910193736p:plain

  • gamma: 0.0001
  • power: 0.75

lr_policyごとに必要なパラメータを設定する
neural network - What is `lr_policy` in Caffe? - Stack Overflow
Solver Prototxt · BVLC/caffe Wiki · GitHub