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配置過程中如有不清楚的地方可進行參考!