caffe學習筆記--網路結構分析
最近的事情比較多,忙過之後終於有時間整理一下思緒了。
在做課題之餘,把caffe框架的網路結構好好梳理了一番,希望可以幫助到有需要的人。
solver.prototxt
test_iter: 100 #預測階段迭代次數為100,設定預測迭代次數為100可以覆蓋全部的10000個測試集 # Carry out testing every 500 training iterations. test_interval: 500 #測試頻率,訓練時,每迭代500次進行一次測試 # The base learning rate, momentum and the weight decay of the network. base_lr: 0.01 #基礎學習率 momentum: 0.9 #基礎衝量 #solver_type: ADAGRAD weight_decay: 0.0005 #基礎權衰量 # The learning rate policy lr_policy: "inv" #學習速率的衰減策略 gamma: 0.0001 #學習率變化的比率 power: 0.75 # Display every 100 iterations display: 100 #每100次顯示一次 # The maximum number of iterations max_iter: 10000 #最大迭代次數 # snapshot intermediate results snapshot: 5000 #每5000次列印一次,即模型儲存一次 snapshot_prefix: "examples/mnist/lenet" #模型儲存位置 # solver mode: CPU or GPU solver_mode: GPU #設定使用CPU或者GPU進行網路訓練
data層
layer { name: "mnist" #層的名稱 type: "Data" #層型別 top: "data" #輸出,有兩個,data和label top: "label" data_param { source: "examples/mnist/mnist-train-leveldb" #訓練資料所在位置 backend: LEVELDB #資料型別 batch_size: 64 #批量數目,表示一次讀取64張 } transform_param { scale: 0.00390625 #資料變換使用的縮放因子 } include: { phase: TRAIN } #該層只在訓練階段有效 }
convolution層
layer { #定義一個卷積層 name: "conv1" type: "Convolution" #該層型別是卷積層 bottom: "data" #該層的輸入層 top: "conv1" #該層的輸出層 param { lr_mult: 1 #權值學習速率倍乘因子,1倍表示保持與全域性引數一致 } param { lr_mult: 2 #偏置學習速率倍乘因子,是全域性引數的2倍(一般偏置學習率是權值學習率的2倍) } convolution_param { #卷積引數 num_output: 20 #feature map維數,既特徵圖個數為20 kernel_size: 5 #卷積核大小 stride: 1 #步長 weight_filler { #權值使用xavier填充器,大多時候用“xavier”,也可用“gaussion” type: "xavier" } bias_filler { #偏置使用常數填充器,預設為0 type: "constant" } } }
卷積層之後一般都會有一個ReLu啟用層
layer {
name: "relu1_1" #啟用函式
type: "ReLU"
bottom: "conv1_1" #輸入層
top: "conv1_1" #輸出層
}
pool層
layer { #定義池化層
name: "pool1"
type: "Pooling" #該層型別是池化層
bottom: "conv1" #該層輸入
top: "pool1" #該層輸出
pooling_param { #池化引數
pool: MAX #最大池化,還有均值池化等
kernel_size: 2 #濾波器大小為2*2
stride: 2 #步長為2,即不重疊
}
}
fc層(全連線層)
layer {
name: "fc6"
type: "InnerProduct" #全連線層,輸出的是一個簡單向量,引數跟卷積層一樣
bottom: "pool5"
top: "fc6"
inner_product_param {
num_output: 4096
}
}
Drop層(隨機的丟棄一些網路引數,可防止過擬合)
layer {
name: "drop6" #丟棄層
type: "Dropout"
bottom: "fc6"
top: "fc6"
dropout_param {
dropout_ratio: 0.5 #引數丟棄的概率
}
}
Crop層
layer {
name: "score"
type: "Crop" #裁剪
bottom: "upscore" #該層輸入
bottom: "data" #該層輸入
top: "score" #該層輸出
crop_param {
axis: 2 #從哪個軸開始裁剪
offset: 19 #從偏移位置開始裁剪
}
caffe中的資料是以blobs的形式存放的,blobs是四維資料(N,C,H,W)分別表示Batch size, Channels, Height, Width,其編號為0,1,2,3.
其中,axis:2表示從第二個軸開始裁剪,也就是裁剪2,3(H,W)兩個軸。
例如:A為bottom,A_size=(20,50,512,512)
B為裁剪的參考輸入,B_size=(20,10,256,256)
C是輸出,C_size=(20,10,256,256)
若axis=1,offeset=(25,128,128)
表示從第一個軸開始裁剪,也就是裁剪(C,H,W)三個軸。
則C_size=A[:, 25 : 25+B.shape(1), 128 : 128+B.shape(2), 128 : 128+B.shape(3) ]
=A[: , 25 : 35 , 128 : 128+256 , 128 : 128+256 ] = A[ : , 10 , 256 , 256]
即C_size=(20 ,10 ,256 ,256)
ConCat層
為了增加網路輸入通道,可以將輸入簡單的拼接在一起。
如下面程式碼所示,可以將RGB資料和depth資料拼接起來作為網路的輸入。
layer {
name: "data"
type: "Concat" #拼接層
bottom: "color" #如果輸入是RGB-D資料的話,可以將RGB和Depth資訊拼接在一起輸入該層,輸出是data層
bottom: "depth"
top: "data"
}
Eltwise層
該層有三種操作:product點乘,sum加減(預設操作),max(取最大值)
layer {
name: "s_fused"
type: "Eltwise"
bottom: "s_frcolor" #該層輸入有兩個,s_frcolor和s_frhha
bottom: "s_frhha"
top: "s_fused" #該層的輸出
eltwise_param {
operation: SUM #操作是加,即將兩個輸入加起來
coeff: 0.5 #第一個輸入的係數
coeff: 0.5 #第二個輸入的係數
}
Eltwise層可以更直接地利用多個輸入資訊,提高演算法的精確度,但是卻增加了演算法的計算時間;而ConCat層雖然只是簡單的將輸入拼接在一起,對於演算法提高的沒有Eltwise層多,但是訓練和測試的速率更快一些。
loss層
layer {
name: "loss" #損失層
type: "SoftmaxWithLoss"
bottom: "score" #預測結果
bottom: "label" #標籤
top: "loss" #該層輸出
loss_param {
ignore_label: 255
normalize: false
}
}