2016-04-03 67 views
2

我修改了http://www.deeplearningbook.org/contents/convnets.html中的方程9.12,以使MxN卷積核心居中。在ArrayFire中實現卷積神經網絡反向傳播(梯度計算)

這給出了梯度以下表達式(只要相信現在),假設1個輸入和1個輸出信道(爲了簡化):

dK(krow, kcol) = sum(G(row, col) * V(row+krow-M/2, col+kcol-N/2); row, col) 

要閱讀以上,DK的單個元件在krow中,kcol等於G乘積的所有行和列的總和乘以移位後的V.注意G和V具有相同的尺寸。我們將定義走向V以外的結果爲零。例如,在一維中,如果G是[abcd],V是[wxyz],並且M是3,那麼第一個和是點(G,[0 wxy]),第二個和是點G,[wxyz]),第三個和是點(G,[xyz 0])。

ArrayFire有一個移位操作,但它做了循環移位,而不是零插入移位。而且,內核大小MxN通常很小,例如7x7,所以看起來更優化的實現將只讀取G和V一次,並在內核上累積。

對於這個1D的例子,我們將在a和w,x中讀取,並以[a * 0 aw ax]開頭。然後我們在b,y中讀取並添加[bw bx by]。然後在c,z中讀取並添加[cx cy cz]。然後在d中讀入,最後添加[dy dz d * 0]。

是否有直接的方法來計算ArrayFire中的dK?我不禁想到這是一種卷積,但我一直無法圍繞卷積看起來像什麼。

+0

你知道你正在嘗試使用sum權限來實現一個convolve嗎?這是非常非常低效的。 ArrayFire具有稱爲'wrap'和'unwrap'的函數,可以讓您在矩陣乘法中轉換(跨步)卷積。這就是你需要使用的。 –

回答

2

啊所以。對於3x3的dK數組,我使用unwrap將我的MxN輸入數組轉換爲兩個MxN列向量。然後我做兩列向量的移位子集的9點積。不,這是行不通的,因爲這個轉變是二維的。

所以我需要創建大小爲1 x(MxN)和(MxN)x 9的中間數組,其中後者的每一列都是原始位移的MxN窗口,大小爲1的填充邊界爲零,然後做矩陣乘法。因此,最終的解決方案是在輸出3x3上做一個gfor,並且對於每個循環,做一個展開一次的G和展開的重複V 。

同意?