1. 程式人生 > >caffe中網路結構引數詳解

caffe中網路結構引數詳解

prototxt檔案是caffe的配置檔案,用於儲存CNN的網路結構和配置資訊。prototxt檔案有三種,分別是deploy.prototxt,train_val.prototxt和solver.prototxt。

1. solver.prototxt

solver.prototxt是caffe的配置檔案。裡面定義了網路訓練時候的各種引數,比如學習率、權重衰減、迭代次數等等。下面詳細說明每一個引數所代表的意義:
  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層

  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層

  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等層。這些層引數比較少,也比較容易理解。這裡就不詳細介紹了。