caffe中網絡結構參數詳解

prototxt文件是caffe的配置文件,用於保存CNN的網絡結構和配置信息。prototxt文件有三種,分別是deploy.prototxt,train_val.prototxt和solver.prototxt。

 

1. solver.prototxt

solver.prototxt是caffe的配置文件。裏面定義了網絡訓練時候的各種參數,比如學習率、權重衰減、迭代次數等等。下面詳細說明每一個參數所代表的意義:

[html] view plain copy

  1. test_iter: 299  
  2. test_interval: 224  
  3. base_lr: 0.01  
  4. display: 20  
  5. max_iter: 6720  
  6. lr_policy: "step"  
  7. gamma: 0.1  
  8. momentum: 0.9  
  9. weight_decay: 0.0001  
  10. stepsize: 2218  
  11. snapshot: 224  
  12. snapshot_prefix: "snapshot"  
  13. solver_mode: GPU  
  14. net: "train_val.prototxt"  
  15. solver_type: SGD  


test_iter:表示網絡的測試迭代次數。網絡一次迭代將一個batchSize的圖片進行測試,所以爲了能將validation集中所有圖片都測試一次,這個參數乘以TEST的batchSize應該等於validation集中圖片總數量。即test_iter*batchSize=val_num。

 

test_interval:表示網絡迭代多少次進行一次測試。一次迭代即一個batchSize的圖片通過網絡正向傳播和反向傳播的整個過程。比如這裏設置的是224,即網絡每迭代224次即對網絡的準確率進行一次驗證。一般來說,我們需要將訓練集中所有圖片都跑一編,再對網絡的準確率進行測試,整個參數乘以網絡data層(TRAIN)中batchSize參數應該等於測試集中圖片總數量。即test_interval*batchSize=train_num。

 

base_lr:表示網絡的基礎學習率。學習率過高可能導致loss持續86.33333,也可能導致loss無法收斂等等問題。過低的學習率會使網絡收斂慢,也有可能導致梯度損失。一般我們設置爲0.01。

 

display: 每多少次顯示一次。

 

max_iter: 網絡的最大迭代次數。訓練集中的圖片當然不能只訓練一次就算了,要反覆多次的進行訓練,所以這個參數應該要大一些。

 

lr_policy: 學習率變化。

 

gamma: 學習率變化比率。一般不改。

 

momentum: 學習的參數。一般不改。

 

weight_decay: 學習的參數。一般不改。

 

stepsize: 每多少次學習率遞減。這裏是迭代2218次學習率遞減。

 

snapshot: 每多少次保存一次學習的結果。即caffemodel。

 

solver_mode: 設置使用GPU還是CPU進行學習訓練。

 

net:  網絡結構的文件路徑。

 

solver_type: 優化算法的選擇,一共有六種可選:SGD、AdaDelta、AdaGrad、Adam、Nesterov和RMSProp。默認爲SGD。

 

 

 

 

solver.prototxt文件只在網絡進行訓練的時候需要載入。是網絡訓練的一個整體的參數配置文件。

 

 

 

2. deploy.prototxt和train_val.prototx

這兩個文件是caffe的網絡結構文件。train_val.prototx是訓練時候的網絡結構,deploy.prototxt用於發佈(即測試時候的網絡結構)。這兩個文件中內容基本一致,但是存在一些細微區別:

 

  1. 在train_val.prototx中網絡結構的data層有兩種,分別爲TRAIN和TEST。顧名思義,TRAIN是網絡訓練時後的數據結構,TEST是網絡做驗證時候的數據結構。一般來說TRAIN中的batchSize比TEST中的要大一些。
  2. 在train_val.prototx中的卷積層(Convolution)中存在學習率和權重衰減的參數,而deploy.prototxt文件中則沒有這些參數(有些deploy.prototxt中仍然有這些參數,但是對測試不起任何作用)。

 

由於train_val.prototx包含了deploy.prototxt文件中所有的參數定義,所以下面以train_val.prototx文件爲例,詳細說明每個參數的意義。這裏以經典的AlexNet網絡爲例:

1.data層

[html] view plain copy

  1. layer {  
  2.   name: "train-data"  
  3.   type: "Data"  
  4.   top: "data"  
  5.   top: "label"  
  6.   include {  
  7.     phase: TRAIN  
  8.   }  
  9.   transform_param {  
  10.     mirror: true  
  11.     crop_size: 227  
  12.     mean_file: "./mean.binaryproto"  
  13.   }  
  14.   data_param {  
  15.     source: "./train_db"  
  16.     batch_size: 128  
  17.     backend: LMDB  
  18.   }  
  19. }  


name: 這一層的名字。

type:這一層的類型。

top: 這一層所連接的上一層。注意,網絡是從下往上生長的。最底層是數據層,越往上特徵越抽象。

phase: TRAIN 表示這一層是訓練時候網絡的定義。

mirror:是否使用鏡像。

crop_size:將輸入數據裁剪爲227。

mean_file:均值文件的路徑。

source:訓練集的路徑。

batch_size:一次迭代輸入的圖片數量。

backend:數據集的格式。

 

2. Convolution層

 

[html] view plain copy

  1. layer {  
  2.   name: "conv1"  
  3.   type: "Convolution"  
  4.   bottom: "data"  
  5.   top: "conv1"  
  6.   param {  
  7.     lr_mult: 1.0  
  8.     decay_mult: 1.0  
  9.   }  
  10.   param {  
  11.     lr_mult: 2.0  
  12.     decay_mult: 0.0  
  13.   }  
  14.   convolution_param {  
  15.     num_output: 96  
  16.     kernel_size: 11  
  17.     stride: 4  
  18.     weight_filler {  
  19.       type: "gaussian"  
  20.       std: 0.01  
  21.     }  
  22.     bias_filler {  
  23.       type: "constant"  
  24.       value: 0.0  
  25.     }  
  26.   }  
  27. }  

 

lr_mult: 學習率。這裏有兩個學習率,分別是filter和bias的學習率。

decay_mult::衰減係數。同樣有兩個,與學習率對應。

num_output::這一層輸出的特徵圖個數。即改成用多少個卷積核去對輸入做卷積操作。

kernel_size:卷積核的尺寸。

stride:卷積的步長。

 

weight_filler {
      type: "gaussian"
      std: 0.01
    }

整個參數是表示使用高斯方法初始化濾波器參數。這裏是使用均值爲0,方差爲0.01的高斯核。

 

bias_filler {
      type: "constant"
      value: 0.0
    }

整個參數表示使用constant方法初始化偏置。即初始偏置設置爲0。

 

 

 

caffe中還有RELU,pooling,LRN,SoftMax,IP,FC等層。這些層參數比較少,也比較容易理解。這裏就不詳細介紹了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章