1. 程式人生 > >從零開始學caffe(四):mnist手寫數字識別網路結構模型和超引數檔案的原始碼閱讀

從零開始學caffe(四):mnist手寫數字識別網路結構模型和超引數檔案的原始碼閱讀

下面為網路結構模型

%網路結構模型
name: "LeNet"               #網路的名字"LeNet"
layer {                     #定義一個層
  name: "mnist"             #層的名字"mnist"
  type: "Data"              #層的型別"Data",表明資料來源於LevelDB或LMDB。另外資料的來源還可能是來自記憶體,HDF5,圖片等
  top: "data"               #top表示輸出,在這裡輸出data
  top: "label"              #這一層共有兩個輸出,這裡輸出label
include { phase: TRAIN #該層只在TRAIN訓練的時候有效 } transform_param { #資料的預處理 scale: 0.00390625 #即1/256,將輸入的資料0-255歸一化到0-1之間 } data_param { source: "E:/Caffe-windows/caffe-windows/examples/mnist/lmdb/train_lmdb" #資料來源 batch_size: 64 #每個批次處理64張圖片 backend: LMDB #資料格式LMDB
} } layer { #定義一個層 name: "mnist" #層的名字"mnist" type: "Data" #層的型別"Data",表明資料來源於LevelDB或LMDB top: "data" #輸出dada top: "label" #輸出label include { phase: TEST #該層只在TEST測試的時候有效 } transform_param {
#資料的預處理 scale: 0.00390625 #1/256,將輸入的資料0-255歸一化到0-1之間 } data_param { source: "E:/Caffe-windows/caffe-windows/examples/mnist/lmdb/test_lmdb" #資料來源 batch_size: 100 #每個批次處理100張圖片 backend: LMDB #資料格式LMDB } } layer { #定義一個層 name: "conv1" #層的名字"conv1" type: "Convolution" #層的型別"Convolution" bottom: "data" #輸入data top: "conv1" #輸出conv1 param { #這個是權值的學習率 lr_mult: 1 #學習率係數。最終的學習率是這個學習率係數lr_mult乘以solver.prototxt超引數檔案裡面的base_lr(基本學習率) } param { #這個是偏置的學習率 lr_mult: 2 #學習率係數。最終的學習率是這個學習率係數lr_mult乘以solver.prototxt裡面的base_lr } convolution_param { num_output: 20 #卷積核的個數為20,或者表示輸出特徵平面的個數為20 kernel_size: 5 #卷積核的大小5*5。如果卷積核長和寬不等,則需要用kernel_h和kernel_w分別設定 stride: 1 #步長為1。也可以用stride_h和stride_w來設定 weight_filler { #權值初始化 type: "xavier" #使用"Xavier"演算法,也可以設定為"gaussian" } bias_filler { #偏置初始化 type: "constant" #一般設定為"constant",取值為0 } } } layer { #定義一個層 name: "pool1" #層的名字"pool1" type: "Pooling" #層的型別"Pooling" bottom: "conv1" #輸入conv1 top: "pool1" #輸出pool1 pooling_param { pool: MAX #池化方法。常用的方法有MAX,AVE或STOCHASTIC kernel_size: 2 #池化核的大小2*2。如果池化核長和寬不等,則需要用kernel_h和kernel_w分別設定 stride: 2 #池化的步長。也可以用stride_h和stride_w來設定 } } layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" param { lr_mult: 1 } param { lr_mult: 2 } convolution_param { num_output: 50 #卷積核的個數為50,或者表示輸出特徵平面的個數為50 kernel_size: 5 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { name: "pool2" type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { pool: MAX kernel_size: 2 stride: 2 } } layer { #定義一個層 name: "ip1" #層的名字"ip1" type: "InnerProduct" #層的型別"InnerProduct",全連線層 bottom: "pool2" #輸入pool2 top: "ip1" #輸出ip1 param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { num_output: 500 #500個神經元 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { #定義一個層 name: "relu1" #層的名字"relu1" type: "ReLU" #層的型別"ReLU",啟用函式,可以防止梯度消失和梯度爆炸 bottom: "ip1" #輸入ip1 top: "ip1" #輸出ip1 } layer { #定義一個層 name: "ip2" #層的名字"ip2" type: "InnerProduct" #層的型別"InnerProduct",全連線層 bottom: "ip1" #輸入ip1 top: "ip2" #輸出ip2 param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { num_output: 10 #10個輸出,代表10個分類 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } layer { #定義一個層 name: "accuracy" #層的名字"accuracy" type: "Accuracy" #層的型別"Accuracy",用來判斷準確率 bottom: "ip2" #層的輸入ip2 bottom: "label" #層的輸入label top: "accuracy" #層的輸出accuracy include { phase: TEST #該層只在TEST測試的時候有效 } } layer { #定義一個層 name: "loss" #層的名字"loss" type: "SoftmaxWithLoss" #層的型別"SoftmaxWithLoss",輸出loss值 bottom: "ip2" #層的輸入ip2 bottom: "label" #層的輸入label top: "loss" #層的輸出loss }

下面為超引數檔案的程式碼

#網路模型描述檔案
#也可以用train_net和test_net來對訓練模型和測試模型分別設定
#train_net: "xxxxxxxxxx"
#test_net: "xxxxxxxxxx"
net: "E:/Caffe-windows/caffe-windows/examples/mnist/lenet_train_test.prototxt"傳入模型檔案
#這個引數要跟test_layer結合起來考慮,在test_layer中一個batch是100,而總共的測試圖片是10000張
#所以這個引數就是10000/100=100
test_iter: 100
#每訓練500次進行一次測試
test_interval: 500
#基本學習率,最終學習率還需要乘以一個引數
base_lr: 0.01
#動力
momentum: 0.9
#type:SGD #優化演算法的選擇。這一行可以省略,因為預設值就是SGD,Caffe中一共有6中優化演算法可以選擇
#Stochastic Gradient Descent (type: "SGD"), 在Caffe中SGD其實應該是Momentum
#AdaDelta (type: "AdaDelta"),
#Adaptive Gradient (type: "AdaGrad"),
#Adam (type: "Adam"),
#Nesterov’s Accelerated Gradient (type: "Nesterov")
#RMSprop (type: "RMSProp")
#權重衰減項,其實也就是正則化項。作用是防止過擬合
weight_decay: 0.0005
#學習率調整策略
#如果設定為inv,還需要設定一個power, 返回base_lr * (1 + gamma * iter) ^ (- power),其中iter表示當前的迭代次數
lr_policy: "inv"
gamma: 0.0001
power: 0.75
#每訓練100次螢幕上顯示一次,如果設定為0則不顯示
display: 100
#最大迭代次數
max_iter: 2000
#快照。可以把訓練的model和solver的狀態進行儲存。每迭代5000次儲存一次,如果設定為0則不儲存
snapshot: 5000
snapshot_prefix: "E:/Caffe-windows/caffe-windows/examples/mnist/models"
#選擇執行模式,這裡以CPU進行模型的執行
solver_mode: CPU