矩阵一维卷积c++_深度神经网络卷积层计算加速与优化
01 傳統卷積層計算
首先我們定義符號F()函數為卷積函數
一維卷積:F(n,m)
n代表輸出的維度,m代表濾波器的維度
二維卷積:F(n*m,r*s)
n*m代表輸出的維度,r*s代表濾波器的維度
下面我們具體談談針對二維的卷積加速
傳統的卷積層加速:
對于最簡單的F(n*m,r*s)
最傳統暴力的卷積運算:
時間成本:1. 乘法:(n*m*r*s)2. 加法:(n*m*(r – 1)*(s – 1))空間成本:1. 輸入層:(n+r-1)*(m + s - 1)2. 卷積核:(r*s)02 Imcol+GEMM
為了更好的理解,首先給出這幅圖:
推廣到三維,也就是Image:C*H*W
最后一頁沒畫,但是基本上就是Filter Matrix乘以Feature Matrix的轉置,得到輸出矩陣Cout x (H x W),就可以解釋為輸出的三維Blob(Cout x H x W)。
相對于傳統的暴力的卷積算法而言,此算法將卷積變成了矩陣乘法,為加速提供了便捷條件,能很容易用硬件實現加速。但是內存有冗余。
03 Imcol+MEC初級版
由于是3x3卷積核,且步長為1。因此,循環取出A、B、C、D、E這5個子矩陣,每個矩陣的維度都是: 輸入高度x3
將A、B、C、D、E按照行優先展開并拼成一個大的中間矩陣L, L的維度則為:5x21。從L中循環取出P、Q、R、S、T這5個子矩陣,并計算5次矩陣乘法,就得到了最終的結果。從上面的示例中我們不難看出,MEC的解決思路在于將im2col這一過程分成了Height和Width兩部分,于是需要存儲的中間矩陣也大大減小了。可能帶來的問題就是,原來的一次矩陣乘法,現在會變成多次小矩陣乘法。雖然有利于并行計算,但也失去了BLAS庫計算大矩陣乘法的優勢。
F( n*m,r*s)原本內存:( n+r – 1) *( m+s – 1)Imcol+GEMM轉換需要內存大小:r * s * n * mImcol+MEC初版需要內存大小:m * ( r * ( n + s – 1 ) )04 Imcol+MEC高級版
考慮了batchsize和channel
05 Winograd方法
說完了這些方法,我們來說說Winograd方法吧,加速卷積的不二之選。本文重在于利用Winograd方法加速卷積,順便選取內存和速度兼顧的方案
公式的推導,這里選用F( 3 *3,2*2)
用多項式的中國剩余定理推導可知:
在其中,我用的是F( 4 * 4 , 3 * 3 )
輸入的tensor:[N,W,H,C]
卷積核的tensor:[C_out,kernal_W,kernel_H,C_in]
圖中K = C_out、T = N
Kernals中的眾矩陣通過從[C_out,3,3,C] -> [C_out,6,6,C]
是一個變形后的卷積核,kernal1 = [1,6,6,128],上圖中有128個卷積核,因為輸出的Tensor:[N,W,H,128],拋開上面具體的實例,為了推導后續公式,這里我們只研究
對于輸入矩陣16X16、卷積核 3X3,采用 F( 4 X 4,3X3 ) 的加速方案:
明確輸出矩陣14 X 14 首先將卷積核通過GgG(T)變成 6X6的矩陣D
現在的問題變成了如何將點乘的集合變成更簡易可表達的形式。再看下面這幅圖:
故我們得到的最后的結果是:
所以最后我們統計一下所作的乘法:
傳統:3 X 3 X 128 X 14 X 14 = 225792Winograd:6 X 6 X 128 X 16 = 73728浮點數運算倍數:225792 / 73728 = 3.0625改進:如若有剩余,考慮用其他矩陣相乘方法
轉自OpenCV學堂 獨家授權頭條轉載
總結
以上是生活随笔為你收集整理的矩阵一维卷积c++_深度神经网络卷积层计算加速与优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql自动备份脚本linux_一个M
- 下一篇: 微服务调用传string值_spring