caffe solver 配置詳解
caffe solver通過協調網絡前向推理和反向梯度傳播來進行模型優化,並通過權重參數更新來改善網絡損失求解最優算法,而solver學習的任務被劃分為:監督優化和參數更新,生成損失並計算梯度。caffe solver是caffe中的核心,它定義著整個模型如何運轉,不管是命令行方式還是pycaffe接口方式進行網絡訓練或測試,都是需要一個solver配置文件的,而solver的配置參數總共有42個,羅列如下:
net weight_decay net_param regularization_type train_net stepsize test_net stepvalue train_net_param clip_gradients test_net_param snapshot train_state snapshot_prefix test_state snapshot_diff test_iter snapshot_format test_interval solver_mode test_compute_loss device_id test_initialization random_seed base_lr type display delta average_loss momentum2 max_iter rms_decay iter_size debug_info lr_policy snapshot_after_train gamma solver_type power layer_wise_reduce momentum weights
模型網絡定義prototxt相關
net: "train_test.prototxt"
net_param {
name: "LeNet"
layers {
name: "mnist"
type: DATA
top: "data"
top: "label"
data_param {
source: "examples/mnist/mnist_train_lmdb"
backend: LMDB
batch_size: 64
}
transform_param {
scale: 0.00390625
}
include: { phase: TRAIN }
}
...
layers {
name: "loss"
type: SOFTMAX_LOSS
bottom: "ip2"
bottom: "label"
top: "loss"
}
}
train_net: "train.prototxt"
test_net: "test.prototxt"
train_net_param: {...}
test_net_param: {...}
net:訓練網絡用的prototxt文件,該文件可能包含不止一個的測試網絡,通常不與train_net和test_net同時定義;
net_param:內聯的訓練網絡prototxt定義,可能定義有不止一個的測試網絡,通常忽略;
train_net_param:內聯的訓練網絡prototxt定義,通常忽略;
test_net_param:內聯的測試網絡prototxt定義,通常忽略;
train_net:訓練網絡用的prototxt文件,通常不與net同時定義;
test_net:測試網絡用的prototxt文件,通常不與net同時定義;
模型運行狀態
train_state: {
phase: TRAIN
}
test_state: {
phase: TEST
stage: ‘test-on-test‘
}
train_state:訓練狀態定義,默認為TRAIN,否則按照模型網絡prototxt定義的來運行;
test_state:測試狀態定義,默認為TEST並在測試集上進行測試,否則按照模型網絡prototxt定義的來運行;
測試網絡參數配置
test_iter: 50
test_interval: 200
test_compute_loss: false
test_initialization: true
test_iter:測試網絡前向推理的叠代次數,註意每測試叠代一次是一個測試網絡定義的batch size大小,test_iter與test_batch_size的乘積應為整個測試集的大小;
test_interval:訓練時每隔多少次叠代則進行一次測試,默認為0即每次訓練完後都會進行一次測試,應該要配置該參數,否則訓練速度超級慢;
test_compute_loss:測試時是否計算損失值,默認為假,通常用於debug分析用;
test_initialization:在第一次訓練叠代之前先運行一次測試,用於確保內存夠用和打印初始的loss值,默認為真;
學習率相關的參數配置
base_lr: 0.1
lr_policy: "multistep"
max_iter: 100000
stepvalue: 10000
stepsize: 5000
gamma: 0.1
power: 0.75
base_lr :初始的學習率;
lr_policy:學習率調整策略;
maxiter:訓練叠代的最大次數;
stepsize:lr_policy為“step”時學習率多少次訓練叠代會進行調整;
stepvalue:lr_policy為“multistep”時學習率多少次訓練叠代會進行調整,該參數可設置多個以用於多次學習率調整;
gamma:用於計算學習率的參數,lr_policy為step、exp、inv、sigmoid時會使用到;
power:用於計算學習率的參數,lr_policy為inv、poly時會使用到;
lr_policy學習率調整策略:
- - fixed:保持base_lr不變.
- - step:如果設置為step,則還需要設置一個stepsize,返回base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示當前的叠代次數
- - exp:返回base_lr * gamma ^ iter, iter為當前叠代次數
- - inv:如果設置為inv,還需要設置一個power,返回base_lr * (1 + gamma * iter) ^ (- power)
- - multistep:如果設置為multistep,則還需要設置一個stepvalue。這個參數和step很相似,step是均勻等間隔變化,而multstep則是根據stepvalue值變化
- - poly:學習率進行多項式誤差,返回 base_lr * (1 - iter/max_iter) ^ (power)
- - sigmoid:學習率進行sigmod衰減,返回 base_lr * ( 1/(1 + exp(-gamma * (iter - stepsize))))
模型優化相關參數
type: "Adam"
solver_type: "Adam"(已棄用)
momentum: 0.9
momentum2: 0.999
rms_decay: 0.98
delta: 1e-8
weight_decay: 0.0005
regularization_type: "L2"
clip_gradients: 0.9
type:優化器類型;
solver_type:已棄用的優化器類型;
momentum:用到動量來進行權重優化的優化器動量;
momentum2:“Adam”優化器的動量參數;
rms_decay:“RMSProp”優化器的衰減參數,其計算方式為MeanSquare(t) = rms_decay*MeanSquare(t-1) + (1-rms_decay)*SquareGradient(t)
delta:RMSProp、AdaGrad、AdaDelta及Adam等優化器計算值為0時的最小限定值,用於防止分母為0等溢出錯誤;
weight_decay:權重衰減參數,用於防止模型過擬合;
regularization_type:正則化方式,默認為L2正則化,可選的有L0、L1及L2,用於防止模型過擬合;
clip_gradients:限定梯度的最大值,用於防止梯度過大導致梯度爆炸;
可選的caffe優化器類型:
到目前的為止,caffe提供了六種優化算法來求解最優參數,在solver配置文件中,通過設置type類型來選擇:
- Stochastic Gradient Descent (type: "SGD"或“0”)
- Nesterov’s Accelerated Gradient (type: "Nesterov"或“1”)
- Adaptive Gradient (type: "AdaGrad"或“2”)
- RMSprop (type: "RMSProp"或“3”)
- AdaDelta (type: "AdaDelta"或“4”)
- Adam (type: "Adam"或“5”)
模型保存快照相關參數
snapshot: 1000
snapshot_prefix: "examples/finetune_pascal_detection/pascal_det_finetune"
snapshot_diff: false
snapshot_format: BINARYPROTO
snapshot_after_train: true
snapshot:保存模型的間隔,即每隔多少次訓練叠代保存一次模型快照,默認為0;
snapshot_prefix:模型保存的路徑及路徑名,但無後綴擴展類型,如果不設定,則使用無擴展的prototxt路徑和文件名來作為模型保存文件的路徑和文件名;
snapshot_diff:是否保存推理結果中的差異,默認不保存,如果保存可幫助調試但會增大保存文件的大小;
snapshot_format:模型保存的類型,有“HDF5”和“BINARYPROTO”兩種,默認為後者BINARYPROTO;
snapshot_after_train:默認為真,即訓練後按照模型保存設定的參數來進行快照,否則直到訓練結束都不會保存模型;
其他的solver參數
display: 1000
average_loss: 50
iter_size: 1
solver_mode: GPU
device_id: 0
random_seed: 600
debug_info: false
layer_wise_reduce: true
weights: "models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"
display:訓練叠代多少次後顯示相關信息到終端,如果置0則不會有任何有效信息打印;
average_loss:顯示上一次叠代平均損失值的間隔,默認為1,通常不設定;
iter_size:用於多少個batch_size後再更新梯度,通常在GPU內存不足時用於擴展batch_size,真時的batch_size為iter_size*batch_size大小;
solver_mode:訓練時使用CPU還是GPU,默認為GPU;
device_id:使用GPU時的設備id號,默認為0;
random_seed:隨機種子起始數字,默認為-1參考系統時鐘;
debug_info:默認為假,如果置真,則會打印模型網絡學習過程中的狀態信息,可用於分析調試;
layer_wise_reduce:數據並行訓練的重疊計算和通信,默認為真;
weights:預訓練模型路徑,可用於加載預訓練模型,如果命令行訓練時也有定義“--weights”則其優先級更高將會覆蓋掉solver文件中該參數的配置,如果命令行訓練時有定義“--snapshot”時則其具有最高優先級將會覆蓋掉“--weights”,如果存在多個權重模型用於加載,可使用逗號進行分離表示;
以上,是目前在caffe-master分支上所能看到的所有solver配置參數,caffe配置過程中如有不清楚的地方可進行參考!
caffe solver 配置詳解