1. 程式人生 > >深度學習(二)卷積計算

深度學習(二)卷積計算

寫在前面:所有關於深度學習的基礎知識均為鄙人的筆記分享,很多內容摘自大神們的部落格或論文,因時間太長記不清了分別來自哪裡。若有侵權,請聯絡鄙人郵箱[email protected]

目前,卷積的計算大多采用間接計算的方式,主要有以下三種實現方式:

  • im2col + GEMM。 caffe等很多框架中都使用了這種計算方式,原因是將問題轉化為矩陣乘法後可以方便的使用很多矩陣運算庫(如MKL、openblas、Eigen等)。
  • FFT變換。 時域卷積等於頻域相乘,因此可將問題轉化為簡單的乘法問題。
  • Winograd。 這種不太熟悉,據說在GPU上效率更高。 NNPACK就是FFT和Winograd方法的結合。

上面三種方法執行效率都還不錯,但對記憶體佔用比較高,因為需要儲存中間結果或者臨時輔助變數。

 

im2col + GEMM 原理

darknet中應用了與caffe一樣的函式

 

下面傳有兩個動圖形象說明

å·ç§¯ç¥ç»ç½ç»

注意!!!!:

1 多通道多卷積操作計算過程

如圖5,輸入影象layer m-1有4個通道,同時有2個卷積核w1和w2。對於卷積核w1,先在輸入影象4個通道分別作卷積,再將4個通道結果加起來得到w1的卷積輸出;卷積核w2類似。所以對於某個卷積層,無論輸入影象有多少個通道,輸出影象通道數總是等於卷積核數量!

縮排對多通道影象做1x1卷積,其實就是將輸入影象於每個通道乘以卷積係數後加在一起,即相當於把原影象中本來各個獨立的通道“聯通”在了一起。

 

2 卷積核計算過程

1、首先,假設輸入圖片大小是 224*224*3(224是影象寬或高,3是三個通道,也就是RGB三種)

2、然後,假設conv1層的是 7*7*96 (7*7是卷積核的size k,96是卷積核的個數n),stride = 2;

3、所以conv1得到的結果是110*110*96([(w-k+pad)/stride+1] * [(h-k+pad)/stride+1] * n) (這個110來自於 (224-7+pad)/2+1 = 110

,這個pad是我們常說的填充,也就是在圖片的周圍補充畫素,這樣做的目的是為了能夠整除,除以2是因為2是圖中的stride);

4、再做一次池化pooling,得到pool1, 池化的核的大小是3*3,所以池化後圖片的維度是55*55*96 ( (110-3+pad)/2 +1 =55 );