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
權值初始化的具體方法可以參考博客