MatConvnet中集成的损失函数(孪生网络的思考)
參看網址:https://www.baidu.com/?tn=94855285_hao_pg
這篇博客主要記載了利用MatCovnet實現孿生網絡的一些問題,最核心的就是兩個分支如何并到一起?反向傳播如何設計?相比Keras、caffe、TensorFlow;matconvnet推動的人太少了,整個社區也非常冷清,不得不說這是matlab公司的眼觀不夠啊..
1. 問題#253的解決方案
Hi,Is it possible to implement a Siamese network using current dag branch of matconvnet? Is so could you please share some sample codes (if available) on it.Thanks, kris314Kris最早提出大家的疑惑,利用現有的無向圖結構能不能實現孿生網絡? Hi, you can implement siamese networks (we did) with simplenn as well. The trick is to pass pairs of images as consecutive entries in the sequence and then use a block such as vl_nnpdist that would pair them up in the loss. VedaldiVedaldi回復了這個事,他建議采用的方法是連續輸入一對圖像,然后這對圖像先后通過base network, 最后一起到達損失函數哪里。注意的是,Vedaldi用的是vl_nnpdist()函數實現的,一會會說這個事。 Hi, almost. Simply pass paired images as consecutive indexes in the batch (e.g. images 1 and 2 in the batch are paired, then 3 and 4 and so on). Then the distance layer can take the difference between images 1 and 2 , 3 and 4 etc). Note that the output of this layer has a batch size exactly half than its input as for each pair of images you get one difference image (and then one distance value). You do get the same effect as a siamese architecture.VedaldiVedaldi的意思就是說,現在啊我們還不能利用兩個孿生的分支并行處理一對圖像。不過呢,我們可以把 一對圖像按照先后順序放一塊, 比如說1&2 是一對; 3&4 是一對。那么輸出的批大小就應該等于輸入的 一半。此外按照Vedaldi所說,我們可以利用距離層對兩張連續的圖像進行區分,這這這...想好想,怎么 實現嘞?加一個時鐘??還是計數器?其實,后來一大堆人追問過這個問題,不幸的是Vedaldi消失了。我也曾經糾結過這種方法,其實他很想2-channel的實現方法,首先進行灰度化,然后將一對灰度圖像當成雙通道來處理,這就變成了最普通的單通道網絡。
2. vl_nnpdist - CNN特征矢量距離計算函數
這個函數恰好就是為了計算兩個特征矢量距離的。其函數表達式為:
VL_NNPDIST(X, X0, P); % X,X0是對應的兩個特征矢量; P代表距離范數 Y(i,j,1) = (SUM_d (X(i,j,d) - X0(i,j,d))^P)^(1/P)X0和X維度一致;輸出Y和X具有相同的寬度和高度,但是深度等于1. 一般來說X0是1x1xDxN矩陣
如果設置 noroot = true, 那么該距離就不進行根除了:
Y(i,j,1) = SUM_d (X(i,j,d) - X0(i,j,d))^P、 例如: vl_nnpdist(x, x0, 2, 'noRoot', true); % 計算對應通道的2-范數距離其實吧 上面的都不重要,重要的在這里:
[DZDX, DZDX0] = VL_NNPDISTP(X, X0, P, DZDY) computes the derivative of the block inputs projected onto DZDY. DZDX, DZDX0 and DZDY have the same dimensions as X and Y, respectively.正向傳播過程中,在這個模塊中我們可以計算兩個特征的距離測度; 反向傳播過程中,我們還可以把誤差分別傳遞給兩個網絡分支,這個才是核心。
還需要注意一點,目前該函數只能接受三個網絡分支,多了會報錯。
例如:vl_nnpdist(x, x0, 2, 'noRoot', true) 就是為了計算特征矢量X,X0的L2平方距離。
關于參數選項:
VL_NNPDIST(___, 'OPT', VAL, ...)可以接受下面參量:1:距離 or 距離的平方 NoRoot [false]: 默認情況下計算p范數,如果設置為true就是計算距離的p次冪; 2:Epsilon = 1e-6 當計算偏導數時,避免除數出現邊界效應;例如,L2距離在圓點處并不光滑,這個選項可以防止導數發散; 3:Aggregate [false] :對于輸入的每一個空間位置,并不是返回一個標量而是將它們全部加到一個標量中; 4:InstanceWeights = []:可以選擇的權重個別案例,用來調節的3. vl_nnloss - CNN損失函數
Y = VL_NNLOSS(X, C)用來計算預測的分數X與標簽C之間的損失。
預測分數X被組織成一個預測矢量場,可以用HxWxDxN矩陣表示。H*W代表空間信息,D代表類別信息,N代表批次的所有數據數量。
盡管在一般情況下都是H=W=1,但是在類似于稠密的標記問題中(例如圖像分割),W,H>1是非常有用的。在后一種情況下,損失是用像素來表示的。(分類的貢獻可以通過加權來實現,InstanceWeights)
DZDX = VL_NNLOSS(X, C, DZDY) computes the derivative of the block projected onto the output derivative DZDY. DZDX and DZDY have the same dimensions as X and Y respectively.
VL_NNLOSS() 支持幾種損失函數,可以通過'loss' = type進行指定。當C中的每一個標量被解釋為類別 標簽,我們可以使用下面幾種損失: 1. Classification error [classerror] L(X,c) = (argmax_q X(q) ~= c). 分類誤差的導數是平的,因此這個損失函數適用于評價,而不是用于評價一個模型。2. Top-K classification error [topkerror] L(X,c) = (rank X(c) in X <= K). 排名最高的也是得分最高的。對于K=1,他就和分類誤差一樣,K 通 過 topK選項可以設定。3. Log loss [log] L(X,c) = - log(X(c)). 這個函數假設X(c)是類別c的分類概率。4. Softmax log loss (multinomial logistic loss) [softmaxlog] L(X,c) = - log(P(c)) where P(c) = exp(X(c)) / sum_q exp(X(q)). 這個和log損失是一樣的, 但是使用softmax函數重新正則化預測。5. Multiclass hinge loss [mhinge] L(X,c) = max{0, 1 - X(c)}. 這個函數假設 X(c)是與其他類別相比,對于c類的分數距離。6. Multiclass structured hinge loss [mshinge] L(X,c) = max{0, 1 - M(c)} where M(c) = X(c) - max_{q ~= c} X(q). 7.二值分類誤差 Binary classification error [binaryerror] L(x,c) = (sign(x - t) ~= c). t是閾值,默認是0,通過 threshold 可以進行設定。如果x是一 個概率,那么閾值t應該設定為0.5.8. 二值分類損失 Binary log loss [binarylog] L(x,c) = - log(c(x-0.5) + 0.5). X假設屬性是正+1的概率。因此,x必須是[0,1]之間的數,這 是log損失函數的二值模式。9. Logistic log loss [logistic] L(x,c) = log(1 + exp(- cx)). 和二值對數損失很類似10. Hinge loss [hinge] L(x,c) = max{0, 1 - cx}. 這是二值分類中的標準hinge損失。如果c=+1對應得分X, c=-1對應得 分0.這個損失就是mshinge損失。11. InstanceWeights [[]]Allows to weight the loss as L'(x,c) = WGT L(x,c), where WGT is a per-instance weight extracted from the array InstanceWeights. For categorical losses, this is either a H x W x 1 or a H x W x 1 x N array. For attribute losses, this is either a H x W x D or a H x W x D x N array.12. TopK [5]Top-K value for the top-K error. Note that K should not exceed the number of labels. See also: VL_NNSOFTMAX().4. 自定義損失函數 - CNN中的L2損失函數
關于這一個損失層我感覺可以用vl_nnpdist函數實現的。特別的對于孿生網絡的(X,X`,Y)這樣的的一種輸入格式,應該可以采用下面這種結構來實現:
?
這種情況下可能要自己設計損失函數了。
總結
以上是生活随笔為你收集整理的MatConvnet中集成的损失函数(孪生网络的思考)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Matconvnet中Conv-Re
- 下一篇: 人际关系的55个绝招