在cnn架構中,大部分時間都是由卷積層消耗的。我們將討論winograd演算法,它可以將浮點乘法的數量減少2.25倍。請參閱
卷積是如何實現的呢?可能你最簡單直觀的想法是for迴圈,但這樣的卷積太慢。為了有效利用cpu快取和參考區域性性。(區域性參考性也稱為區域性性原理,是指處理器很有可能會在短時間內重複訪問同一組儲存器位置。),我們可以將卷積運算轉換為矩陣乘法。
我們將展示一種將卷積運算轉換為矩陣乘法的方法。這有利於以更多記憶體使用為代價更快地計算。我們使用im2col操作將輸入影象或批處理轉換為矩陣,然後我們將此矩陣與reshape的核心相乘。然後在最後,我們使用col2im操作將該相乘後的結果矩陣reshape為影象。
卷積基本上是過濾器核心和移動視窗選擇的區域性區域(取樣)之間的點積,取樣的小塊(patch)與核心大小是相同的。如果我們在記憶體上擴充套件所有可能的視窗並將點積作為矩陣乘法執行,會發生什麼。那將可能導致200倍或更多的加速,以更多的記憶體消耗為代價。(使用blas庫來執行矩陣乘法,例如cublas(gpu)或intel mkl(cpu),它們針對矩陣乘法進行了優化。)
例如,如果大小為[227x227x3]步幅4和填充0的輸入與11x11x3濾波器進行卷積,那麼我們將在輸入中取樣[11x11x3]畫素塊並將每個畫素塊拉伸為大小 11 * 11 * 3 = 363的列向量。
對於具有步幅4和填充0的大小為227的輸入,沿寬度和高度會有((227-11)/ 4)+1 = 55個結果位置,得到尺寸為[363×3025]的輸出矩陣x_col。這裡的每列都是伸展的感受野,總共有55 * 55 = 3025個。
總結一下如何計算im2col輸出大小:
[img_height, img_width, img_channels] = size(img);
newimgheight = floor(((img_height + 2*p - ksize) / s)+1);
newimgwidth = floor(((img_width + 2*p - ksize) / s)+1);
cols = single(zeros((img_channels*ksize*ksize),(newimgheight * newimgwidth)));
conv層的權重以類似的方式伸展成行。例如,如果有96個大小為[11x11x3]的過濾器,則會得到乙個大小為[96 x 363]的矩陣w_row(11x11x3 = 363)。
在轉換影象和核心之後,卷積可以實現為簡單的矩陣乘法,在我們的例子中,w_col [96 x 363]乘以x_col [363 x 3025]得到的矩陣[96 x 3025],最後reshape為[55x55x96]。
假設我們有輸入影象˚f大小為4和 過濾器大小為3。
然後,使用上面介紹的im2col函式將輸入影象轉換為
那麼,winograd怎樣才能進一步提高速度呢?它捨棄使用點積,而是使用下面的公式計算結果矩陣。
也就是,
其中,這樣我們就可以得到m1,m2,m3,m4的值。然後用它們來計算卷積而無需計算矩陣的點積。明顯,經過這樣的變換後,在每個卷積運算時不需要多次計算(g0 + g1 + g2)/ 2和(g0-g1 + g2)/ 2的值,因為濾波器的值是一樣的。我們可以在訓練網路期間在卷積之前計算一次,並且可以在推理期間預先計算儲存。
使用這個演算法,我們需要 4次 add和4次 mul操作計算m1,m2,m3,m4,然後基於計算好的m1,m2,m3,m4的值,使用4 個add操作得到結果。而在進行普通的點積時,我們將進行6次mul操作而不是4次。明顯winograd可以將計算成本高昂的mul操作減少1.5倍,這對速度的提高是非常重要的。
在上面的例子中,我使用了f(4,3),即f(4)和g(3),它需要2次卷積。最小1d演算法 f(m,r)與其自身巢狀以獲得最小2d演算法f(mxm,rxr)。如果我們嘗試使用f(4,4)和g(3,3),這需要4次卷積,winograd演算法使用4 * 4 = 16個mul,對比普通的卷積使用2 * 2 * 9 = 36個mul,這樣可以將mul減少2.25倍。
【參考文章】
卷積的矩陣理解
卷積是神經中常見的一種操作,人們通常習慣從直覺上理解卷積層的卷積操作。但是在 實現的時候通常需要更為數學化的卷積表達形式,而且理解卷積的數學形式反過來可以幫助更好地理解卷積操作的本質。卷積的數學形式通常通過矩陣乘法來表示。本文從卷積最一般的數學形式開始講起,並從一般形式變換為不同網路中的各種特殊形式...
Matlab中矩陣卷積函式convn
最近在看cnn做手寫數字識別,其中cnn中convolution在影象處理中就涉及了矩陣卷積。因為博主有了奧本海姆 訊號與系統 中一維卷積的基礎,這裡就模擬的推廣一下矩陣卷積 二維,高維類似 卷積步驟 1.考慮到卷積的交換律,可以選擇較方便矩陣 一般選較小 作為卷積核。對此矩陣進行繞中心的180度旋...
矩陣卷積運算過程講解
在爬蟲處理驗證碼的過程中接觸到矩陣卷積運算,關於該類運算,記錄一下自己的心得。理論知識 在講述卷積過程前,我們來了解一下卷積公式。根據離散二維卷積公式 其中a為被卷積矩陣,k為卷積核,b為卷積結果,該公式中,三個矩陣的排序均從0開始。現在對於上面卷積過程進行分析 我們用來做例子的 a 矩陣為 m m...