1. 程式人生 > >【Caffe】solver檔案配置解讀

【Caffe】solver檔案配置解讀

Caffe之solver檔案配置

講解一下solver.prototxt檔案裡面個引數的意義。

DL的任務中,幾乎找不到解析解,所以將其轉化為數學中的優化問題。sovler的主要作用就是交替呼叫前向傳導和反向傳導 (forward & backward) 來更新神經網路的連線權值,從而達到最小化loss,實際上就是迭代優化演算法中的引數。

Caffe的solver類提供了6種優化演算法,配置檔案中可以通過type關鍵字設定:

  • Stochastic Gradient Descent(type:”SGD”)
  • AdaDelta(type:”AdaDelta”)
  • Adaptive Gradient(type:”AdaGrad”)
  • Adam(type:”Adam”)
  • Nesterov’s Accelerated Gradient (type: “Nesterov”)
  • RMSprop (type: “RMSProp”)
    簡單地講,solver就是一個告訴caffe你需要網路如何被訓練的一個配置檔案。

Solver.prototxt流程

1.首先設計好需要優化的物件,以及用於學習的訓練網路和測試網路的prototxt檔案(通常是train.prototxt和test.prototxt檔案)
2.通過forward和backward迭代進行優化來更新引數
3.定期對網路進行評價
4.優化過程中顯示模型和solver的狀態

Solver引數

base_lr
這個引數代表的是此網路最開始的學習速率(Beginning Learning rate),一般是個浮點數,根據機器學習中的知識,lr過大會導致不收斂,過小會導致收斂過慢,所以這個引數設定也很重要。

lr_policy

這個引數代表的是learning rate應該遵守什麼樣的變化規則,這個引數對應的是字串,選項及說明如下:

  • “step” - 需要設定一個stepsize引數,返回base_lr * gamma ^ ( floor ( iter / stepsize ) ),iter為當前迭代次數
  • “multistep” - 和step相近,但是需要stepvalue引數,step是均勻等間隔變化,而multistep是根據stepvalue的值進行變化
  • “fixed” - 保持base_lr不變
  • “exp” - 返回base_lr * gamma ^ iter, iter為當前迭代次數
  • “poly” - 學習率進行多項式誤差衰減,返回 base_lr ( 1 - iter / max_iter ) ^ ( power )
  • “sigmoid” - 學習率進行sigmod函式衰減,返回 base_lr ( 1/ 1+exp ( -gamma * ( iter - stepsize ) ) )

gamma
這個引數就是和learning rate相關的,lr_policy中包含此引數的話,需要進行設定,一般是一個實數。

stepsize

This parameter indicates how often (at some iteration count) that we should move onto the next “step” of training. This value is a positive integer.

stepvalue
This parameter indicates one of potentially many iteration counts that we should move onto the next “step” of training. This value is a positive integer. There are often more than one of these parameters present, each one indicated the next step iteration.

max_iter
最大迭代次數,這個數值告訴網路何時停止訓練,太小會達不到收斂,太大會導致震盪,為正整數。

momentum
上一次梯度更新的權重,real fraction

weight_decay
權重衰減項,用於防止過擬合。

solver_mode
選擇CPU訓練或者GPU訓練。

snapshot
訓練快照,確定多久儲存一次model和solverstate,positive integer。

snapshot_prefix
snapshot的字首,就是model和solverstate的命名字首,也代表路徑。

net
path to prototxt (train and val)

test_iter
每次test_interval的test的迭代次數,假設測試樣本總數為10000張圖片,一次性執行全部的話效率很低,所以將測試資料分為幾個批次進行測試,每個批次的數量就是batch_size。如果batch_size=100,那麼需要迭代100次才能將10000個數據全部執行完,所以test_iter設定為100。

test_interval
測試間隔,每訓練多少次進行一次測試。

display
間隔多久對結果進行輸出

iter_size
這個引數乘上train.prototxt中的batch size是你實際使用的batch size。 相當於讀取batchsize * itersize個影象才做一下gradient decent。 這個引數可以規避由於gpu記憶體不足而導致的batchsize的限制 因為你可以用多個iteration做到很大的batch 即使單次batch有限。

average_loss
取多次foward的loss作平均,進行顯示輸出

Basic

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "examples/mnist/model/"
solver_mode: CPU

Adam

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.001
momentum: 0.9
momentum2: 0.999
lr_policy: "fixed"
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
type: "Adam"
solver_mode: CPU

AdaGrad

net: "examples/mnist/mnist_autoencoder.prototxt"
test_state: { stage: 'test-on-train' }
test_iter: 500
test_state: { stage: 'test-on-test' }
test_iter: 100
test_interval: 500
test_compute_loss: true
base_lr: 0.01
lr_policy: "fixed"
display: 100
max_iter: 65000
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "examples/mnist/mnist_autoencoder_adagrad_train"
solver_mode: GPU
type: "AdaGrad"

rmsprop

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.0
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet_rmsprop"
solver_mode: GPU
type: "RMSProp"
rms_decay: 0.98

AdaDelta

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
lr_policy: "fixed"
momentum: 0.95
weight_decay: 0.0005
display: 100
max_iter: 10000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet_adadelta"
solver_mode: GPU
type: "AdaDelta"
delta: 1e-6

Nesterov

net: "examples/mnist/mnist_autoencoder.prototxt"
test_state: { stage: 'test-on-train' }
test_iter: 500
test_state: { stage: 'test-on-test' }
test_iter: 100
test_interval: 500
test_compute_loss: true
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 10000
display: 100
max_iter: 65000
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "examples/mnist/mnist_autoencoder_nesterov_train"
momentum: 0.95
solver_mode: GPU
type: "Nesterov"

FCN的Solver.prototxt

train_net: "train.prototxt"
test_net: "val.prototxt"
test_iter: 736
# make test net, but don't invoke it from the solver itself
test_interval: 999999999
display: 20
average_loss: 20
lr_policy: "fixed"
# lr for unnormalized softmax
base_lr: 1e-10
# high momentum
momentum: 0.99
# no gradient accumulation
iter_size: 1
max_iter: 100000
weight_decay: 0.0005
snapshot: 4000
snapshot_prefix: "snapshot/train"
test_initialization: false