caffe中參數設置的解析

lenet_solver.prototxt:

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 100
test_interval: 500
base_lr: 0.01
momentum: 0.9
type: SGD
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 100
max_iter: 20000
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU

net:網絡模型(訓練網絡模型、測試網絡模型)

test_iter:測試的批次數,這個參數要與batch_size結合起來理解,例如:mnist數據集中測試樣本總數爲10000,一次執行全部數據效率很低,因此,我們將測試數據分幾個批次來執行。假定我們設置batch_size爲100,則需要迭代100次才能將10000個數據全部執行完,因此,將test_iter設置爲100。執行完一次全部數據,稱之爲一個epoch


test_iterval:測試間隔,每訓練500次進行一次測試


base_lr: 0.01    
lr_policy: "inv"
gamma: 0.0001
power: 0.75

這四行是對學習率的設置,base_lr用來設置基礎學習率,在迭代的過程中,可以對基礎學習率進行調整,lr_policy用來設置調整策略。其中,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是均勻等間隔變化,而multistep則是根據                                        stepvalue值變化
  • - poly:        學習率進行多項式誤差, 返回 base_lr (1 - iter/max_iter) ^ (power)
  • - sigmoid:     學習率進行sigmod衰減,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))


type:優化算法的選擇,目前caffe中有六種優化方法,參考博客:http://blog.csdn.net/qq_26898461/article/details/50445394

  • Stochastic Gradient Descent (type: "SGD"),
  • AdaDelta (type: "AdaDelta"),
  • Adaptive Gradient (type: "AdaGrad"),
  • Adam (type: "Adam"),
  • Nesterov’s Accelerated Gradient (type: "Nesterov"
  • RMSprop (type: "RMSProp")


weight_decay:權重衰減,主要是爲了防止過擬合

momentum:動量,參考博客

max_iter:最大迭代次數,這個參數設置太小的話,會導致沒有收斂,精確度很低

display:在屏幕上的顯示頻率,每訓練100次顯示一次,如果設置爲0,則不顯示

snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
這兩行用來設置快照,snapsnot用來設置每訓練多少次後進行保存一次模型,snapsnot_prefix用來設置保存的路徑

solver_mode:設置運行模式,有CPU、GPU兩種模式


lenet_train_test.prototxt :

name: "LeNet"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN       //在訓練階段包含該層
  }
  transform_param {   
    scale: 0.00390625  //對數據進行均一化,幅度歸一化到同樣的範圍[0, 255]

  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"  //訓練數據來源
    batch_size: 64
    backend: LMDB
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST         //在測試階段包含該層
  }
  transform_param {
    scale: 0.00390625   //對數據進行均一化,幅度歸一化到同樣的範圍[0, 255]
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb"  //測試數據來源
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1       //weight的學習率,需要乘以base_lr
  }
  param {
    lr_mult: 2       //bias的學習率,需要乘以base_lr,一般bias的學習率是weight學習率的2倍
  }
  convolution_param {
    num_output: 20   //卷積核的個數
    kernel_size: 5   //卷積核的大小
    stride: 1        //卷積核的步長
    weight_filler {  //權值初始化,有以下幾種方式:xavier, constant, gaussian等
      type: "xavier"
    }
    bias_filler {    //偏置項的初始化,一般設置爲constant,值全爲0
      type: "constant"
    }
  }
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX         //池化方法,有:MAX,AVG,SHOCHASTIC
    kernel_size: 2
    stride: 2
  }
}
...

其他參數:

decay_mult:權值衰減,需要乘以weight_decay,wi = wi -(base_lr * lr_mult) *dwi - (weight_dacay * decay_mult) * wi (dwi是誤差關於wi的偏導數)

drop_ratio:丟棄數據的概率,和dropout層相關,詳解:http://blog.csdn.net/u013989576/article/details/70174411

權值初始化的具體方法可以參考博客







發佈了81 篇原創文章 · 獲贊 51 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章