caffe層解讀系列 hinge loss

2021-07-24 08:33:22 字數 1923 閱讀 6274

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,...