1. 程式人生 > >caffe中的train_val.prototxt的檔案的理解

caffe中的train_val.prototxt的檔案的理解

本文以CaffeNet為例:
1. train_val.prototxt 
首先,train_val.prototxt檔案是網路配置檔案。該檔案是在
訓練的時候用的。
2.deploy.prototxt
該檔案是在測試時使用的檔案。
區別:
首先deploy.prototxt檔案都是在train_val.prototxt檔案的基礎上刪除了一些東西,所形成的。
由於兩個檔案的性質,train_val.prototxt檔案裡面訓練的部分都會在deploy.prototxt檔案中刪除。
在train_val.prototxt檔案中,開頭要加入一下訓練設定檔案和準備檔案。例如,transform_param中的mirror: true(開啟映象);crop_size: ***(影象尺寸);mean_file: ""(求解均值的檔案),還有data_param中的source:""(處理過得資料訓練集檔案);batch_size: ***(訓練圖片每批次輸入圖片的數量);backend: LMDB(資料格式設定)。然後接下來,訓練的時候還有一個測試的設定,測試和訓練模式的設定通過一個include{phase: TEST/TRAIN}來設定。接下來就是要設定TEST模組內容。然後其他設定跟上面一樣,裡面有個batch_size可以調小一點,因為測試的話不需要特別多的圖片數量。而以上這一塊的內容在deploy裡表現出來的只有一個數據層的設定。只需設定name,type,top,input_param這些即可。
接下來,第一個卷積層的設定,train_val.prototxt檔案中多了param(反向傳播學習率的設定),這裡需要設定兩個param一個時weight的學習率,一個時bias的學習率,其中一般bias的學習率是weight學習率的兩倍。然後就是設定convolution_param,但是在train_val裡面需要有weight_filler的初始化和對bias_filler的初始化。然後就是設定啟用啟用函式。這一塊由於沒有初始化,所以兩個檔案都是一樣的。
再接下來就是池化層,由於池化就是降低解析度,所以這兩邊是一樣的,只需要設定kernel_size,stride,pool即可。無需引數的初始化。
再下來時LRN層,該層的全稱是Local Response Normalization(區域性響應值歸一化),該層的作用就是對區域性輸入進行一個歸一化操作,不過現在有論文表明,這一層加不加對結果影響不是很大,有利於收斂。但這一層的定義都是相同的。
再接下來就是"conv2"、"relu2"、"pool2"、"LRN2"這樣的迴圈,具體跟之前說的一樣,train_val主要多的就是引數的初始化和學習率的設定。
在第五個卷積層之後,進入了"fc6"層,該層是全連線層,這裡train_val裡面還是多兩個param學習率的設定,和weight_filler、bias_filler的初始化設定,而兩者共同的是有一個輸出向量元素個數的設定:inner_product_param。
再接下來就是啟用函式RELU。
再接下來就是Dropout層,該層的目的就是為了防止模型過擬合。這其中有一個dropout_ration的設定一般為0.5即可。
再接下來就是"fc7",這一層跟"fc6"相同。然後就是"relu7"、"drop7"都是相同的。然後就是"fc8"也與之前相同。
再接下來就是Accuracy,這個層是用來計算網路輸出相對目標值的準確率,它實際上並不是一個損失層,所以沒有反傳操作。但是在caffe官網中,它在損失層這一部分。所以在deploy.prototxt檔案中,這一層的定義是沒有的。
再接下來train_val的最後一個層是"SoftmaxWithLoss"層,也是簡單的定義了name,type,bottom,top就完了。而這一塊的內容也不在deploy.prototxt檔案中。而在deploy.prototxt檔案中直接定義了一個type:"Softmax"。通過對CaffeNet這兩個檔案的檢視發現deploy.prototxt檔案 和train_val.prototxt檔案之間的差異在很多層裡面牽扯到訓練部分的都會被刪除,然後就是反向傳播訓練部分會被刪除。
其中,這裡面有一個區別在裡頭,就是為什麼train_val裡
面的是SoftmaxWithLoss而deploy裡面的是Softmax層(兩個都是損失層,都沒有任何引數):這裡面其實都是softmax迴歸的應用,只是在定義成Softmax時直接計算了概率時還有forward部分,而在SoftmaxWithLoss部分時是還有backward的部分。所以這裡就出現了區別,具體的區別可以看這兩個檔案的C++定義。
********solver.prototxt************************************************************************************************
在solver.prototxt檔案中新增變數:resultforsnap  = 0.64
在src/caffe/proto/caffe.proto 檔案中,
message SolverParameter {}中新增:
optional float resultforsnap = 40 [default = 1e-8];
在include/caffe/solver.hpp檔案中新增變數:
float maxresult;
如何使用:
在solver.cpp中呼叫示例為:
maxresult = param_.resultforsnap();  
並且一定要make clean--->make...
********train_val.prototxt************************************************************************************************
在prototxt檔案中,新增:
softmaxloss_param
{
    temp: 0.5
 }
在src/caffe/proto/caffe.proto 檔案中,
新增(如果已經有,就不用了):
optional SoftmaxLossParameter softmaxloss_param =41;(
ID要唯一)
同時新增:
message SoftmaxLossParameter {
  optional float temp= 1 [default =0.5];
}
如何使用?
請在對應的layer中,
this->layer_param_.softmaxloss_param().temp()
就可以呼叫其引數啦!