天天看點

caffe中卷積層的實作

在caffe中卷基層是通過矩陣相乘來實作的實作,直接計算卷積可以由下面的程式表示:

caffe中卷積層的實作

可以看到,這段程式循環嵌套多,時間複雜度高,而使用矩陣相乘的形式:很多現成的矩陣運算庫,不重複“造輪子” 。

我們來看代碼:

caffe中卷積層的實作

在conv_layer 中卷記的操作主要由上面兩個帶紅框的操作組成,其中bias是為卷積操作後的結果加入偏差項,這個簡單暫不分析。關鍵在于gemm,卷積操作的核心所在。如下圖:

caffe中卷積層的實作

在做矩陣相乘之前首先要将圖檔轉化成向量的形式,調用的函數就是im2col。然後就是矩陣相乘gemm。Im2col 是一個用于圖像到向量轉換的函數,你大多數情況下不需要了解他,他的作用就是用在caffe原生的卷積運算中,将卷積運算變成矩陣相乘的運算。具體分析im2col_layer.cpp代碼:

如下為參數設定的一些代碼:

caffe中卷積層的實作

SetUp kernelShape

caffe中卷積層的實作

SetUp stride

caffe中卷積層的實作

SetUp pad

caffe中卷積層的實作

其中,pad的含義可以由下圖所示:

caffe中卷積層的實作

SetUp dilation(膨脹系數)

caffe中卷積層的實作

通過reshape為im2col配置設定空間:

caffe中卷積層的實作

以及計算生成的卷記feature map的尺寸:

caffe中卷積層的實作

最關鍵的核心在于如下代碼:

caffe中卷積層的實作

這段代碼看上去特别複雜,但整體上可以分成兩個部分,一個是紅框的,一個是綠的。其中input_row:在原圖中的行數input_col:在原圖中的列數

通過這段代碼,卷記的kernel就能轉化成如下的矩陣:

caffe中卷積層的實作

這樣,feature map 就轉換成了對應的矩陣的形式,是以,卷積的操作也就能對應的用矩陣相乘的形式實作了。

[email protected]中國科學技術大學多媒體計算與通信教育部-微軟重點實驗室

MultiMedia Computing Group

繼續閱讀