圖解神祕的NC4HW4

【GiantPandaCV導語】以卷積和im2col+gemm實現卷積操做舉例,來圖解深度學習中Tensor的NC4HW4(其實應該是N{C/4+C%4>0?1:0}HW4),寫成NC4HW4方便閱讀.git

什麼是NC4HW4?

  • 對於卷積操做, 根據計算機內存排布特色, 按行進行處理.處理完一個通道的數據, 轉入下一個通道繼續按行處理.
卷積操做示意圖
  • 對於一個nchw格式的Tensor來講, 其在計算機中的內存排布是這樣的:
NCHW的Tensor內存排布示意圖
  • 使用cpp一次指令處理一個數據, 用來處理卷積操做,  即循環實現乘法相加便可.
卷積實現示意圖
  • 如今有一條指令處理4組數據的能力, 好比x86結構的sse指令,arm的neon指令.以及GPGPU的OpenGL和OpenCL,單次處理RGBA四組數據. 若是繼續使用nchw內存排布的話, 是這樣的.
想使用指令集加速卷積,不能直接計算
  • 根據按行處理特色, 對於Feature和kernel的寬不是4倍數進行處理, 會出現錯誤. 圖中的kernel很明顯以已經到了第二行的值。那麼有沒有方法在按行處理的思想上, 一次處理4個數,而不受影響.答案是有的, 即NC4HW4.即把前4個通道合併在一個通道上, 依次類推, 在通道數不夠4的狀況下進行補0.

  • 通過NC4HW4重排後的Tensor在內存中的排布狀況以下:
通過NC4HW4重排後的Tensor在內存中的排布示意圖
  • 那麼, 此時在進行單次指令處理4組數據的處理,就沒有問題了.只不過處理結果也是NC4HW4結構的,須要在結果輸出加上NC4HW4轉nchw.
使用指令集加速卷積,能夠直接計算

NC4HW4中使用im2col+gemm實現卷積:

  • im2col+gemm在深度學習中是最經常使用的對卷積進行加速計算的方案。最先在caffe框架中支持。思路以下:
卷積示意圖
  • 使用im2col+gemm進行計算:
Im2Col圖解
  • 對於NC4HW4內存排布的Tensor來講,一樣能夠採用im2col+gemm來處理.
  • 有以下卷積,可使用NC4HW4內存排布方式,使用指令集優化對卷積進行加速.
卷積示意圖
  • NCHW轉NC4HW4.
NCHW轉NC4HW4
  • NC4HW4對feature進行im2col
NC4HW4對feature進行im2col示意圖
  • NC4HW4對kernel進行im2col
NC4HW4對kernel進行im2col
  • 使用SSE,Neon,OpenCL或OpenGL實現Gemm.
使用SSE,Neon,OpenCL或OpenGL實現Gemm

最後

  • 歡迎關注我和BBuf及公衆號的小夥伴們一塊維護的一個深度學習框架Msnhnet:  https://github.com/msnh2012/Msnhnet

推薦閱讀


歡迎關注GiantPandaCV, 在這裏你將看到獨家的深度學習分享,堅持原創,天天分享咱們學習到的新鮮知識。( • ̀ω•́ )✧github

有對文章相關的問題,或者想要加入交流羣,歡迎添加BBuf微信:web

二維碼

爲了方便讀者獲取資料以及咱們公衆號的做者發佈一些Github工程的更新,咱們成立了一個QQ羣,二維碼以下,感興趣能夠加入。算法

公衆號QQ交流羣


本文分享自微信公衆號 - GiantPandaCV(BBuf233)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信

相關文章
相關標籤/搜索