caffe中網路結構引數詳解
阿新 • • 發佈:2018-12-31
prototxt檔案是caffe的配置檔案,用於儲存CNN的網路結構和配置資訊。prototxt檔案有三種,分別是deploy.prototxt,train_val.prototxt和solver.prototxt。
1. solver.prototxt
solver.prototxt是caffe的配置檔案。裡面定義了網路訓練時候的各種引數,比如學習率、權重衰減、迭代次數等等。下面詳細說明每一個引數所代表的意義:- test_iter: 299
- test_interval: 224
- base_lr: 0.01
- display: 20
- max_iter: 6720
- lr_policy: "step"
- gamma: 0.1
- momentum: 0.9
- weight_decay: 0.0001
- stepsize: 2218
- snapshot: 224
- snapshot_prefix: "snapshot"
- solver_mode: GPU
- net: "train_val.prototxt"
- 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用於釋出(即測試時候的網路結構)。這兩個檔案中內容基本一致,但是存在一些細微區別:- 在train_val.prototx中網路結構的data層有兩種,分別為TRAIN和TEST。顧名思義,TRAIN是網路訓練時後的資料結構,TEST是網路做驗證時候的資料結構。一般來說TRAIN中的batchSize比TEST中的要大一些。
- 在train_val.prototx中的卷積層(Convolution)中存在學習率和權重衰減的引數,而deploy.prototxt檔案中則沒有這些引數(有些deploy.prototxt中仍然有這些引數,但是對測試不起任何作用)。
1.data層
- layer {
- name: "train-data"
- type: "Data"
- top: "data"
- top: "label"
- include {
- phase: TRAIN
- }
- transform_param {
- mirror: true
- crop_size: 227
- mean_file: "./mean.binaryproto"
- }
- data_param {
- source: "./train_db"
- batch_size: 128
- backend: LMDB
- }
- }
name: 這一層的名字。
type:這一層的型別。
top: 這一層所連線的上一層。注意,網路是從下往上生長的。最底層是資料層,越往上特徵越抽象。
phase: TRAIN 表示這一層是訓練時候網路的定義。
mirror:是否使用映象。
crop_size:將輸入資料裁剪為227。
mean_file:均值檔案的路徑。
source:訓練集的路徑。
batch_size:一次迭代輸入的圖片數量。
backend:資料集的格式。
2. Convolution層
- layer {
- name: "conv1"
- type: "Convolution"
- bottom: "data"
- top: "conv1"
- param {
- lr_mult: 1.0
- decay_mult: 1.0
- }
- param {
- lr_mult: 2.0
- decay_mult: 0.0
- }
- convolution_param {
- num_output: 96
- kernel_size: 11
- stride: 4
- weight_filler {
- type: "gaussian"
- std: 0.01
- }
- bias_filler {
- type: "constant"
- value: 0.0
- }
- }
- }
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等層。這些層引數比較少,也比較容易理解。這裡就不詳細介紹了。