hinge loss 主要針對要求」maximum-margin」的分類問題,因此尤其適用於svm分類。
hinge loss的定義如下:
\(l(y) = max(0,1-t\cdot y)\)
從定義可以很容易看出,當 \(t\) 和 \(y\) 符號一致(表示 \(y\) 分類正確) 且 \(\vert y\vert \ge 1\) 時hinge loss \(l(y)=0\); 當符號不一致時,\(l(y)=0\) 隨 \(y\) 線性增加。
caffe中定義與上面的介紹有些相反的地方,下面具體介紹caffe中具體是怎樣實現的。
caffe提供了 l1 和 l2 兩種hinge loss,即
\(l(y) = \vert h\vert_1 \)和\(l(y) = \vert h\vert_2 \)其中
\(h_i = max(0,1+t\cdot y), \quad if\ \ i=label,\ 則t=-1; \quad 否則 \ t=1\)
下面舉例說明,caffe中是如何計算多分類的hinge loss的:
比如我們要分5類,下表是分類器的5個輸出,已知label=3.id1
2345
y-1.73
-1.24
0.89
-0.99
0.05t1
1-111
於是可以很容易得出h為:id1
2345
h0.00
0.00
0.11
0.01
1.05 於是
\(l(y) = \vert h\vert_1 = \sum_^h_i = 1.17\)
\(l(y) = \vert h\vert_2 = \sum_^h_^ = 1.1147\)
caffe中的實現原始碼如下:
void hingelosslayer::forward_cpu(const
vector
*>& bottom,
const
vector
*>& top)
for (int i = 0; i < num; ++i)
} dtype* loss = top[0]->mutable_cpu_data();
switch (this->layer_param_.hinge_loss_param().norm())
}
hinge loss的求導非常簡單,
還是以上一節中的例子來說明l1下的求導
\(\frac = 0, \quad if\ \ h_i=0\)
\(\frac = \frac = t, \quad if\ \ h_i\neq 0\)
實際計算值如下表:id1
2345
\(h\)
0.00
0.00
0.11
0.01
1.05
\(l1:\partial
h_i \)
0.00
0.00
-1.00
1.00
1.00
\(l2:\partial
h_i \)
0.00
0.00
-0.22
0.02
2.10
caffe中的求導實現原始碼如下:
if (propagate_down[0])
const dtype loss_weight = top[0]->cpu_diff()[0];
switch (this->layer_param_.hinge_loss_param().norm())
}
caffe學習系列 層解讀
層型別 accuracy layer 可以看到,caffe中計算accuracy時,是通過比較最後乙個全連線層 神經元個數 類別數 但沒有加入activation function 的輸出和資料集的labels來得到的,計算過程在accuracylayer中實現 我也一直非常困惑,計算accurac...
caffe層筆記系列Loss層
1.可選引數 1 ignore label int型變數,預設為空。如果指定值,則label等於ignore label的樣本將不參與loss計算,反向傳播時梯度直接置0。2 normalize bool型變數,即loss會除以參與計算的樣本總數,否則loss等於直接求和。3 normalizati...
caffe 學習系列啟用層及其引數
在啟用層中,對輸入資料進行啟用操作 實際上就是一種函式變換 是逐元素進行運算的。從bottom得到乙個blob資料輸入,運算後,從top輸出乙個blob資料。在運算過程中,沒有改變資料的大小,即輸入和輸出的資料大小是相等的。輸入 n c h w 輸出 n c h w 常用的啟用函式有sigmoid,...