1. 程式人生 > >caffe學習筆記--網路結構分析

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
}
}