1. 程式人生 > >caffe solver 配置詳解

caffe solver 配置詳解

max 正則化 deb 保存文件 bat interval 防止 過擬合 del

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 配置詳解