從零開始學caffe(四):mnist手寫數字識別網路結構模型和超引數檔案的原始碼閱讀
阿新 • • 發佈:2018-12-26
下面為網路結構模型
%網路結構模型
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