Caffe中如果高效實現卷積層

2021-10-01 13:31:00 字數 1707 閱讀 4999

卷積層是caffe中比較關鍵的的乙個層,其裡面實現運用了大量技巧,關鍵卷積層的實現可以看看賈清楊是如何吐槽的

按照一般卷積層的實現思路就是用多層迴圈來實現,針對乙個w*h的,深度為d, 卷積kernel為k*k, 共有m個濾波,則實現一般如下

for w in 1..w

for h in 1..h

for x in 1..k

for y in 1..k

for m in 1..m

for d in 1..d

output(w, h, m) += input(w+x, h+y, d) * filter(m, x, y, d)

endend

endend

endend

就是不斷往裡面巢狀迴圈,需要多達6層迴圈,如此實現在賈清楊看來是非常可怕,而且非常的不效率,而實際caffe中的實現將其分為兩個步驟,如下為賈清楊做的ppt,

至於如何將卷積轉成成矩陣形式,首先需要了解《high performance convolutional neural networks for document processing》這篇文章

該圖是將卷積轉換到矩陣的核心思想,該圖的上半部分為傳統的卷積部分,上述例子為乙個三通道的3*3的,其卷積核為2*2,每個通道乙個,共有6個卷積核,在傳統的卷積就如上半部分所述,將卷積核在上按照 2*2卷積核逐點方式進行掃瞄,每個卷積輸出為2*2大小,其**表述上述正如開頭方式,使用迴圈逐步進行計算。

而影象的下半部分就是將其轉換成矩陣形式,首先看第乙個通道掃瞄部分資料為1 2 1 1,將其轉換到一行之中,然後將第二個通道的第乙個點掃瞄部分0 2 0 3,轉換成一行的第二個部分,依次將第三個通道1 2 0 1轉換到該行的第三個部分,按照此種方式,將每個通道的同乙個位置所做的卷積部分,展開成一行。然後依次步驟將掃瞄的第二個點轉換成一行,... ...,然後將每個通道的卷積核展開成一列,第二個濾波核展開成第二列,如此以來,第乙個點的卷積,就變成第一行和第一列的矩陣相乘。

經過轉換之後其卷積層的輸出就轉變成y= x*w的矩陣相乘,x的矩陣的行大小為輸入的寬度*高度,列大小為卷積核k*k, 輸出大小為k*d,其中d為卷積核的個數。

下面是幾個詳細說明caffe的卷積實現過程,和上述**中的實現幾乎一樣

就是將每個畫素點所做需要做的卷積點,按照行進行展開,如果是多通道則將所有的通道的的點展開成一行。

所展開的矩陣行為h*w, 列為c*k*k 。

Caffe中卷積層的實現

出處 將尺寸為k k的卷積核在某個位置對應的feature map區域表示為k k的一維向量 將feature map各個通道對應的向量之間,串聯起來 那麼尺寸k k的卷積核在某個位置對應的各個通道的feature map,組合起來就是長度為c k k的一維向量。當卷積核對應到新的位置上,又得到新的...

caffe原始碼 卷積層

input 3 5 5 c h w pading 1 步長 2 卷積核 2 3 3 3 n c k k output 2 3 3 c h w 如下圖所示 首先需要理解caffe裡面的im2col和col2im 然後 卷積層 其實和 全連線層 差不多了 input 3 4 4 c h w 卷積核 1 ...

caffe中的卷積

如上,將三維的操作轉換到二維上面去做,然後呼叫gemm庫進行矩陣間的運算得到最後結果。兩個矩陣相乘,需要中間的那個維度相同,這個相同的維度就是c k k,其中c是feature map的維度,k為卷積核的邊長。按照卷積核在feature map上面滑窗的順序將其展開成二維的。在三維上面看,就是卷積核...