1. 程式人生 > >Caffe學習(六)損失層及其引數設定

Caffe學習(六)損失層及其引數設定

機器學習的目的就是通過對訓練樣本輸出與真實值不一致的進行懲罰,得到損失Loss,然後採用一定的優化演算法對loss進行最小優化,進而得到合理的網路權值。本文介紹Caffe中含有的常見的LossLayer及其引數設定方法

Caffe的LossLayer主要由6個:

(1)ContrastiveLossLayer

對比損失函式主要用來訓練siamese網路,改網路為專門處理同時輸入兩張影象的網路,如用於FaceVerification的DeepID網路。在改網路的最後需要對比兩張影象是否為一張人臉,因此需要一個對比損失函式。目標檢測暫時不會用到

(2)EuclideanLossLayer

適合迴歸任務,尤其輸出值為實數時。

輸入blob向量:長度為2,兩個(N,C,H,W)維的prediction與groundTruth blobN張影象,在這裡的CHW應該都是1.

輸出blob:預測值與真實值的均方誤差E,實數


(3)HingeLossLayer

按損失函式,適用於多分類任務。

輸入blob向量:長度為2,包括

                      預測的score值:(N,C,H,W)維,代表N個樣本每一個樣本在C類中的每一類上的得分。其中HW應該都為1

                      真實值:(N,1,1,1),樣本的真實Label

輸出blob:損失值E


其中

其中表示第n個樣本在第k類上的得分,p表示L範數的階,預設為1範數。可取2範數。

由SVM的原理可知一層全連線網路+HingeLossLayer等價於一個線性SVM,2範數Hinge損失的SVM也叫做L2-SVM

(4)InfogainLossLayer

資訊增益損失。MultinomialLogisticLoss的泛化版本,不僅僅接受預測的每個樣本在每類上的概率資訊,還接受資訊增益矩陣資訊。當資訊增益矩陣為單位陣的時候兩者是等價的。

輸入blob:

             預測概率值:(N,C,H,W)維,其中HW應該為1

             真實標籤:(N,1,1,1)維

             資訊增益矩陣H(可選,預設為單位陣):(1,1,K,K)維,其中K為類別的個數

輸出blob:誤差損失E


(5)MultinomialLogisticLossLayer

多項邏輯損失,主要處理多分類問題。當輸出是每一類的概率時用這個損失函式。

輸入blob:

            預測概率值:每一個樣本在每一類的概率,(N,C,H,W)維,N為樣本個數,C為類別個數,HW應該均為1

            真實標籤:(N,1,1,1)維

輸出blob:誤差損失E,其中表示估計的樣本n為其真實標籤label的概率


(5)SoftmaxLossLayer

等價於softmaxLayer+MultinomialLogisticLossLayer。在訓練時用該層,測試時用softmax層。為什麼要多新增一個SoftmaxLossLayer,而不是用Softmax+MltinomialLogisticLayer來做?主要原因是直接採用這種SoftmaxLoss計算梯度時在數值計算上更穩定!!!具體原因參考點選開啟連結

輸入blob:每個樣本在每個類別的得分

輸出blob:誤差損失E,形式同多項邏輯損失,只不過估計概率P的來源不一樣

(6)SigmoidCrossEntroyLossLayer

Sigmoid交叉熵損失,主要用於二分類問題。

等價於SigmoidLayer+CrossEntropyLayer,第一層先將score轉為概率輸入(為什麼不是softmaxLayer轉換為概率呢???對於二分類問題用Sigmoid函式計算出一個概率即可,多分類問題用softmax函式),第二層計算交叉熵損失.採用一個新層而不是由兩個已有的層來實現,主要原因也是由於數值穩定性

輸入blob:每個樣本在每一類上的得分。(N,C,H,W)維,其中HW應該為1。

輸出blob:誤差損失E,其中Pn表示估計的該類為類1的概率,labeln為樣本n的類別(0或者1)。


由E的定義可知,該E其實等價於MultinomialLogisticLoss中的二分類情況

最後來個提醒,Caffe中,預設每一層都可以作為LossLayer,不過層的名字中不帶Loss的層其"Loss_weight"屬性預設為0,即對最後的總的Loss貢獻為0。名字中帶Loss的層可以在網路的任意位置使用(不一定非在網路的輸出最後部分),且可以有不止一個LossLayer,最後的訓練所使用的Loss為所有LossLayer損失的加權和,即按下式計算:

loss := 0
for layer in layers:
  for top, loss_weight in layer.tops, layer.loss_weights:
    loss += loss_weight * sum(top)