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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM