caffe im2col 詳解

感謝Tiger-Gao的淵博知識,本文轉自https://blog.csdn.net/mrhiuser/article/details/52672824。

本文講解的是caffe中卷積過程,衆所周知caffe中卷積採用的是im2col和sgemm的方式。網上已經有很多的im2col的講解。原本不打算寫這篇文章(在此不得不吐槽下,網上有不少的講解caffe im2col的過程的文章多是錯的。一些文章和caffe的具體實現對不上,真不知道他們到底有沒有看caffe代碼的具體實現,正是因爲那些文章,浪費了不少時間。)

本文舉例講解caffe中im2col 和 sgemm的具體過程。在此之前先說明下:caffe中的數據是行優先(row-major)存儲的。
一:im2col
一個圖像 input_num=1;
圖像通道 input_channel=1;
圖像高 input_h=4;
圖像寬 input_w=4;
kernel高 kernel_h=3;
kernel寬 kernel_w=3;
stride=1;pad=0;
卷積後,輸出圖像的計算公式:
output_h=(input_h-kernel_h)/stride+1;
output_w=(input_w-kernel_w)/stride+1;

如下圖,(注:圖像中數據不代表圖像的顏色數值)
原圖(圖a)按照從左到右、從上到下的過程,將(a)中大小爲3*3(因爲kernel大小爲3*3)的矩陣拉成右圖(圖b)中的一列。具體過程如下圖所示:

二:多通道的im2col
假設有三個通道(R、G、B)圖像通道 input_channel=3;
圖像在內存中的存儲是:首先是連續存儲第一通道的數據,然後再存儲第二通道的數據,最後存儲第三通道的數據。如下圖:
多通道的im2col的過程,是首先im2col第一通道,然後在im2col第二通道,最後im2col第三通道。各通道im2col的數據在內存中也是連續存儲的。如下圖:
三:kernel
圖像的每個通道對應一個kernel通道,如下圖(注:爲計算簡單,將kernel的值設置爲1,同樣此值不代表顏色數值。)
kernel的通道數據在內存中也是連續存儲的。所以上面的kernel圖像也可以表示爲下圖:
三:矩陣乘 sgemm
在caffe中圖像與kernel的矩陣乘,是kernel*img。即:在矩陣乘法中
M=1 ,
N=output_h * output_w
K=input_channels * kernel_h * kernel_w

如下圖所示:
圖像數據是連續存儲,因此輸出圖像也可以如下圖所示【output_h * output_w】=【2*2】:

四:多通道圖像輸出
在caffe中圖像與kernel的矩陣乘中:
M=output_channels ,
N=output_h * output_w
K=input_channels * kernel_h * kernel_w

如下圖:
同樣,多個輸出通道圖像的數據是連續存儲,因此輸出圖像也可以如下圖所示【output_channels*output_h * output_w】=【3*2*2】,

(完)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章