【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