影象卷積的fft實現驗證(python)
1、Caffe的卷積操作時間主要在矩陣乘法,假設一個m*n卷積核,且輸入通道數為1,輸出特徵圖大小為h*w,則乘法個數m*n*h*w,這裡的優化僅限於對矩陣的乘法優化,因此,只要選擇適合的矩陣計算庫就可以了。
2、若使用FFT來計算影象卷積。其主要步驟如下。
假設輸入影象的大小為len=h*w,卷積核大小k_len=m*n;通常len>>k_len;
-
對輸入影象A做FFT,其演算法的時間複雜度為o(lenlglen);
-
對卷積核B做FFT,但是由於卷積核與輸入影象尺寸不一樣,需要將卷積核擴充套件,即將卷積核倒置後,補len-k_len個0。
-
將A、B傅立葉變換的結果相乘,即對應位相乘獲得結果
-
對C做IFFT,得到結果D,在D中每隔k_len的值實部取出來,就是影象卷積的結果。因為影象卷積其實就是對應位相乘,所以需要每隔k_len取值,時間複雜度為o(len)
假設卷積核個數>1,需要對卷積核重新擴充套件後重復2)3)4)步驟,並與上一個卷積核影象卷積的值對應位相加就能獲得。
驗證正確性:
輸入影象的卷積順序-1,1,3,82,43,1,31,3,1,354,-2,-3,-1
卷積核1,2,-1,3
影象卷積結果:22,96,15,50.
此處注意,計算結果是用卷積核與輸入影象進行乘法累加。
使用FFT結果:22,96,15,50。
此處注意,將卷積核逆置。
結果正確
暫時未能看出此方法的優越性,從空間上看,需要對卷積核進行擴充套件,其空間大小與輸入影象的尺寸大小一樣。時間上分析,僅二者FFT對應相乘的時間的乘法個數就和矩陣乘法個數的數量級是一樣的了(當len>>k_len時)。適用於卷積核尺寸較大的情景。
雖然沒理解為什麼效能提升這麼多,但是該論文所做的實驗證明了FFT效能很好,雖然複雜度推導跟我推導的差不多~此論文用了cuFFT庫
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
至於多通道,多卷積核的,經python驗證,卷積結果正確,其大概步驟如下:
水平有限,出錯之處,希望得到各位的指正。