MatConvnet中集成的损失函数(孪生网络的思考)
參看網(wǎng)址:https://www.baidu.com/?tn=94855285_hao_pg
這篇博客主要記載了利用MatCovnet實(shí)現(xiàn)孿生網(wǎng)絡(luò)的一些問題,最核心的就是兩個(gè)分支如何并到一起?反向傳播如何設(shè)計(jì)?相比Keras、caffe、TensorFlow;matconvnet推動的人太少了,整個(gè)社區(qū)也非常冷清,不得不說這是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最早提出大家的疑惑,利用現(xiàn)有的無向圖結(jié)構(gòu)能不能實(shí)現(xiàn)孿生網(wǎng)絡(luò)? 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回復(fù)了這個(gè)事,他建議采用的方法是連續(xù)輸入一對圖像,然后這對圖像先后通過base network, 最后一起到達(dá)損失函數(shù)哪里。注意的是,Vedaldi用的是vl_nnpdist()函數(shù)實(shí)現(xiàn)的,一會會說這個(gè)事。 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的意思就是說,現(xiàn)在啊我們還不能利用兩個(gè)孿生的分支并行處理一對圖像。不過呢,我們可以把 一對圖像按照先后順序放一塊, 比如說1&2 是一對; 3&4 是一對。那么輸出的批大小就應(yīng)該等于輸入的 一半。此外按照Vedaldi所說,我們可以利用距離層對兩張連續(xù)的圖像進(jìn)行區(qū)分,這這這...想好想,怎么 實(shí)現(xiàn)嘞?加一個(gè)時(shí)鐘??還是計(jì)數(shù)器?其實(shí),后來一大堆人追問過這個(gè)問題,不幸的是Vedaldi消失了。我也曾經(jīng)糾結(jié)過這種方法,其實(shí)他很想2-channel的實(shí)現(xiàn)方法,首先進(jìn)行灰度化,然后將一對灰度圖像當(dāng)成雙通道來處理,這就變成了最普通的單通道網(wǎng)絡(luò)。
2. vl_nnpdist - CNN特征矢量距離計(jì)算函數(shù)
這個(gè)函數(shù)恰好就是為了計(jì)算兩個(gè)特征矢量距離的。其函數(shù)表達(dá)式為:
VL_NNPDIST(X, X0, P); % X,X0是對應(yīng)的兩個(gè)特征矢量; P代表距離范數(shù) Y(i,j,1) = (SUM_d (X(i,j,d) - X0(i,j,d))^P)^(1/P)X0和X維度一致;輸出Y和X具有相同的寬度和高度,但是深度等于1. 一般來說X0是1x1xDxN矩陣
如果設(shè)置 noroot = true, 那么該距離就不進(jìn)行根除了:
Y(i,j,1) = SUM_d (X(i,j,d) - X0(i,j,d))^P、 例如: vl_nnpdist(x, x0, 2, 'noRoot', true); % 計(jì)算對應(yīng)通道的2-范數(shù)距離其實(shí)吧 上面的都不重要,重要的在這里:
[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.正向傳播過程中,在這個(gè)模塊中我們可以計(jì)算兩個(gè)特征的距離測度; 反向傳播過程中,我們還可以把誤差分別傳遞給兩個(gè)網(wǎng)絡(luò)分支,這個(gè)才是核心。
還需要注意一點(diǎn),目前該函數(shù)只能接受三個(gè)網(wǎng)絡(luò)分支,多了會報(bào)錯(cuò)。
例如:vl_nnpdist(x, x0, 2, 'noRoot', true) 就是為了計(jì)算特征矢量X,X0的L2平方距離。
關(guān)于參數(shù)選項(xiàng):
VL_NNPDIST(___, 'OPT', VAL, ...)可以接受下面參量:1:距離 or 距離的平方 NoRoot [false]: 默認(rèn)情況下計(jì)算p范數(shù),如果設(shè)置為true就是計(jì)算距離的p次冪; 2:Epsilon = 1e-6 當(dāng)計(jì)算偏導(dǎo)數(shù)時(shí),避免除數(shù)出現(xiàn)邊界效應(yīng);例如,L2距離在圓點(diǎn)處并不光滑,這個(gè)選項(xiàng)可以防止導(dǎo)數(shù)發(fā)散; 3:Aggregate [false] :對于輸入的每一個(gè)空間位置,并不是返回一個(gè)標(biāo)量而是將它們?nèi)考拥揭粋€(gè)標(biāo)量中; 4:InstanceWeights = []:可以選擇的權(quán)重個(gè)別案例,用來調(diào)節(jié)的3. vl_nnloss - CNN損失函數(shù)
Y = VL_NNLOSS(X, C)用來計(jì)算預(yù)測的分?jǐn)?shù)X與標(biāo)簽C之間的損失。
預(yù)測分?jǐn)?shù)X被組織成一個(gè)預(yù)測矢量場,可以用HxWxDxN矩陣表示。H*W代表空間信息,D代表類別信息,N代表批次的所有數(shù)據(jù)數(shù)量。
盡管在一般情況下都是H=W=1,但是在類似于稠密的標(biāo)記問題中(例如圖像分割),W,H>1是非常有用的。在后一種情況下,損失是用像素來表示的。(分類的貢獻(xiàn)可以通過加權(quán)來實(shí)現(xiàn),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() 支持幾種損失函數(shù),可以通過'loss' = type進(jìn)行指定。當(dāng)C中的每一個(gè)標(biāo)量被解釋為類別 標(biāo)簽,我們可以使用下面幾種損失: 1. Classification error [classerror] L(X,c) = (argmax_q X(q) ~= c). 分類誤差的導(dǎo)數(shù)是平的,因此這個(gè)損失函數(shù)適用于評價(jià),而不是用于評價(jià)一個(gè)模型。2. Top-K classification error [topkerror] L(X,c) = (rank X(c) in X <= K). 排名最高的也是得分最高的。對于K=1,他就和分類誤差一樣,K 通 過 topK選項(xiàng)可以設(shè)定。3. Log loss [log] L(X,c) = - log(X(c)). 這個(gè)函數(shù)假設(shè)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)). 這個(gè)和log損失是一樣的, 但是使用softmax函數(shù)重新正則化預(yù)測。5. Multiclass hinge loss [mhinge] L(X,c) = max{0, 1 - X(c)}. 這個(gè)函數(shù)假設(shè) X(c)是與其他類別相比,對于c類的分?jǐn)?shù)距離。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是閾值,默認(rèn)是0,通過 threshold 可以進(jìn)行設(shè)定。如果x是一 個(gè)概率,那么閾值t應(yīng)該設(shè)定為0.5.8. 二值分類損失 Binary log loss [binarylog] L(x,c) = - log(c(x-0.5) + 0.5). X假設(shè)屬性是正+1的概率。因此,x必須是[0,1]之間的數(shù),這 是log損失函數(shù)的二值模式。9. Logistic log loss [logistic] L(x,c) = log(1 + exp(- cx)). 和二值對數(shù)損失很類似10. Hinge loss [hinge] L(x,c) = max{0, 1 - cx}. 這是二值分類中的標(biāo)準(zhǔn)hinge損失。如果c=+1對應(yīng)得分X, c=-1對應(yīng)得 分0.這個(gè)損失就是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. 自定義損失函數(shù) - CNN中的L2損失函數(shù)
關(guān)于這一個(gè)損失層我感覺可以用vl_nnpdist函數(shù)實(shí)現(xiàn)的。特別的對于孿生網(wǎng)絡(luò)的(X,X`,Y)這樣的的一種輸入格式,應(yīng)該可以采用下面這種結(jié)構(gòu)來實(shí)現(xiàn):
?
這種情況下可能要自己設(shè)計(jì)損失函數(shù)了。
總結(jié)
以上是生活随笔為你收集整理的MatConvnet中集成的损失函数(孪生网络的思考)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Matconvnet中Conv-Re
- 下一篇: 人际关系的55个绝招