prototxt文件是caffe的配置文件,用於保存CNN的網絡結構和配置信息。prototxt文件有三種,分別是deploy.prototxt,train_val.prototxt和solver.prototxt。
1. solver.prototxt
solver.prototxt是caffe的配置文件。裏面定義了網絡訓練時候的各種參數,比如學習率、權重衰減、迭代次數等等。下面詳細說明每一個參數所代表的意義:
[html] view plain copy
- 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中仍然有這些參數,但是對測試不起任何作用)。
由於train_val.prototx包含了deploy.prototxt文件中所有的參數定義,所以下面以train_val.prototx文件爲例,詳細說明每個參數的意義。這裏以經典的AlexNet網絡爲例:
1.data層
[html] view plain copy
- 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層
[html] view plain copy
- 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等層。這些層參數比較少,也比較容易理解。這裏就不詳細介紹了。