CNN中卷積運算轉化成矩陣乘法的實現——img2col+GEMM大矩陣乘法


img2col:將特征圖image(3D)根據卷積核的尺寸按原圖對應位置展開成行col(2D)。

當卷積步長小於核邊長時,img2col會造成特征圖像素的重疊復制增加內存,但是依然是更有效率的。

 

核矩陣:將每個卷積核展成一列,即核矩陣的高為k*k*C_{k}C_{k}為每個卷積核的通道數),寬為Num_{kernl}

特征圖矩陣:image2col的關鍵就是根據卷積步長卷積核的尺寸將featuremap(3D)按原圖的位置依次轉化成 由多個寬為k*k*C_{k}的行向量(col),這些col拼成了特征圖矩陣。

 

以下為亂寫了。。。。。。

假設原圖為H1*W1*C,卷積核為k*k*C*Fn(Fn為卷積核數目)

H*W個行向量(行向量維度為k*k*C),image矩陣維度為(H*W)*(k*k*C),然后將每個卷積核也展開成k*k*C的列向量,因此核矩陣的維度為(k*k*C)*Fn

矩陣乘法后即為(H*W)*Fn,H*W為卷積后輸出特征圖的尺寸,Fn就是特征圖的輸出通道數。

  •  
  • 無論是pytorch還是tensorflow其都是接收一個batch的數據進行處理,因此其卷積運算的矩陣乘法實現也是一個batch一次運算的。而把輸入圖片input轉換成矩陣的過程就是img2col。
  • 首先將filter展開為(filter_h * filter_w * in_channnel, out_channel)大小的2D矩陣
  • 如果按數學上的運算,則卷積讀取內存是不連續的,會增加時間成本。因此才有了img2col,矩陣在內存中是一個連續的內存塊。在matlab中img2col是將img每次卷積運算對應的patch展開成列向量。而在caffe中是將每個patch轉換成行,本質上沒區別。以下為tensorflow中的過程,類似matlab。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM