1. 程式人生 > >MatConvnet中整合的損失函式(孿生網路的思考)

MatConvnet中整合的損失函式(孿生網路的思考)

這篇部落格主要記載了利用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,
kris314

Kris最早提出大家的疑惑,利用現有的無向圖結構能不能實現孿生網路?
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.
Vedaldi

Vedaldi回覆了這個事,他建議採用的方法是連續輸入一對影象,然後這對影象先後通過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.

Vedaldi

Vedaldi的意思就是說,現在啊我們還不能利用兩個孿生的分支並行處理一對影象。不過呢,我們可以把
一對影象按照先後順序放一塊, 比如說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整合損失函式孿生網路思考

這篇部落格主要記載了利用MatCovnet實現孿生網路的一些問題,最核心的就是兩個分支如何併到一起?反向傳播如何設計?相比Keras、caffe、TensorFlow;matconvnet推動的人太少了,整個社群也非常冷清,不得不說這是matlab公司的眼觀不夠啊..

機器學習Logistic損失函式以及神經網路損失函式詳解

機器學習中最重要的三個部分為網路結構、損失函式、優化策略。 而其中以損失函式最難以理解,主要原因是需要較強的數學知識,其中用的最多的就是引數估計。 所謂引數估計就是:對未知引數θ進行估計時,在引數可能的取值範圍內選取,使“樣本獲得此觀測值”的概率最大的引數作為θ的估計,這樣選定的有利於”

Python的分組函式groupby、itertools

from operator import itemgetter #itemgetter用來去dict中的key,省去了使用lambda函式 from itertools import groupby #itertool還包含有其他很多函式,比如將多個list聯合起來。。 d1={'name':'zhangsa

mysql時間查詢函式包括時間戳

這些函式都是MySQL自帶的,可以直接使用在PHP寫的MySQL查詢語句中哦 1-CURDATE()或CURRENT_DATE()和CURTIME()或CURRENT_TIME() 這兩個函式是比較常用到的,顧名思義,第一個返回當前日期,第二個返回當前時間 可以在MySQL

OpenCV的LUT函式查表法

簡單來說就是通過對映關係,將原影象的畫素值進行縮減操作,比如說  table[56]=5,就表示將畫素值為56的點對映為5,這種方法僅有賦值運算,不涉及乘除、加減運算,可以極大降低時間複雜度。程式原始碼:/* LUT查表函式的使用,結合滑動條函式 */ #include

[深度學習] 神經網路的啟用函式Activation function

20180930 在研究調整FCN模型的時候,對啟用函式做更深入地選擇,記錄學習內容 啟用函式(Activation Function),就是在人工神經網路的神經元上執行的函式,負責將神經元的輸入對映到輸出端。 線性啟用函式:最簡單的linear fun

faster rcnn損失函式—— Smoooh L1 Loss的講解

1. 使用Smoooh L1 Loss的原因 對於邊框的預測是一個迴歸問題。通常可以選擇平方損失函式(L2損失)f(x)=x^2。但這個損失對於比較大的誤差的懲罰很高。 我們可以採用稍微緩和一點絕對損失函式(L1損失)f(x)=|x|,它是隨著誤差線性增長,而不是平方增長

為什麼神經網路需要啟用函式activation function

在看tensorflow的時候,發現書中程式碼提到,使用ReLU啟用函式完成去線性化為什麼需要啟用函式去線性化?查了一下quaro,覺得這個回答能看明白(順便問一句,截圖算不算引用??)---------------------------------------------

神經網路的啟用函式activation function-Sigmoid, ReLu, TanHyperbolic(tanh), softmax, softplus

  不管是傳統的神經網路模型還是時下熱門的深度學習,我們都可以在其中看到啟用函式的影子。所謂啟用函式,就是在神經網路的神經元上執行的函式,負責將神經元的輸入對映到輸出端。常見的啟用函式包括Sigmoid、TanHyperbolic(tanh)、ReLu、 sof

理解交叉熵作為損失函式在神經網路的作用

交叉熵的作用 通過神經網路解決多分類問題時,最常用的一種方式就是在最後一層設定n個輸出節點,無論在淺層神經網路還是在CNN中都是如此,比如,在AlexNet中最後的輸出層有1000個節點: 而即便是ResNet取消了全連線層,也會在最後有一個1000個節

faster rcnn 損失函式——softmax,softmax loss和cross entropy的講解

先理清下從全連線層到損失層之間的計算。來看下面這張圖,(非常好的圖)。 T類  N表示前一層特徵層flatten後的數字   fltten後的特徵      無限大小的T類                     從0-1的T類向量                   

理解交叉熵(cross_entropy)作為損失函式在神經網路的作用

交叉熵的作用通過神經網路解決多分類問題時,最常用的一種方式就是在最後一層設定n個輸出節點,無論在淺層神經網路還是在CNN中都是如此,比如,在AlexNet中最後的輸出層有1000個節點: 而即便是ResNet取消了全連線層,也會在最後有一個1000個節點的輸出層: 一般情況下

python一些常用的函式不定時更新

一、random函式 import random # 在1~20中隨機取一個數 print(random.choice(range(1, 20))) 9 # 在1~20中隨機取五個陣列成一個列表 print(random.choices(range(1, 20), k=5)) [3, 1

機器學習常用損失函式

1. 損失函式 損失函式(Loss function)是用來估量你模型的預測值 f(x)f(x)值。 2. 常用損失函式 常見的損失誤差有五種: 1. 鉸鏈損失(Hinge Loss):主要用於支援向量機(SVM) 中

JS回撥函式一)

一.前奏 多用在使用 js 寫元件時,尤其是元件的事件很多都需要回調函式的支援 假設   A是回撥函式,B是呼叫者,B引數裡一個是指向A的函式指標,即回撥A,同時另外的引數傳遞給A作為引數 二.JS中函式可作為引數傳遞,甚至在另一個函式內部返回 一旦作為引數

【Kaggle-MNIST之路】CNN結構再改進+交叉熵損失函式

簡述 這裡再添加了一個卷積層。用一個kernal=4的卷積層做一個卷積之後,再做對映。 基於之前的一個版本 【Kaggle-MNIST之路】CNN結構改進+改進過的損失函式(五) 成績:0.9898 排名:1000+ 程式碼 注意

Golang的匿名函式閉包

GO語言的匿名函式就是閉包,以下是《GO語言程式設計》中對閉包的解釋  基本概念閉包是可以包含自由(未繫結到特定物件)變數的程式碼塊,這些變數不在這個程式碼塊內或者任何全域性上下文中定義,而是在定義程式碼塊的環境中定義。要執行的程式碼塊(由於自由變數包含在程式碼塊中,所以這些自由變數以及它們引用的

【超解析度】超解析度的imresize函式python, Matlab

背景: 超解析度挑戰賽Super Resolution Challenges (e.g. NTIRE) 降取樣(downscaling)- bicubic interpolation- 是利用Matlab的imresize()函式實現的。 Track info: Track 1:

多種型別的神經網路孿生網路

目錄: 一、CPPN 二、孿生網路Siamese 三、改進的孿生網路 四、Triplet Network 一、CPPN(Compositional Pattern Producing Network)複合模式生成網路 CPPN是一種基於遺傳演算法演化神經網路結構的生成式模型。 1、前言: 一個

mysql的轉換函式講義

--轉換函式: --to_number(數值型別的字元):將字元轉換為數值 --to_char(數值或者是日期):將數值或者日期轉換為字元 --to_date(日期格式的字元):將字元轉換為日期 ----------------數值和字元的互轉----