我想實現一個卷積神經網絡,我不明白爲什麼使用im2col操作更高效。它基本上將分隔列中的輸入與濾波器相乘。但爲什麼不應該直接使用循環來計算卷積,而不是首先執行im2col?如何在卷積網中使用im2col操作更高效?
2
A
回答
2
嗯,你在想以正確的方式,在亞歷克斯淨近95%的GPU時間和CPU時間的89%都花在卷積層和完全連接層。
卷積層和完全連接層是使用GEMM實現的,GEMM代表矩陣乘法矩陣。
因此,基本上在GEMM中,我們通過使用函數
im2col()
將卷積轉換爲矩陣乘法,該函數以可通過矩陣乘法實現卷積輸出的方式排列數據。現在,您可能會有一個問題,而不是直接進行元素卷積,爲什麼我們要在兩者之間添加一個步驟以不同方式排列數據,然後使用GEMM。
答案是這樣的,科學程序員已經花了幾十年時間來優化代碼以執行大矩陣到矩陣乘法,並且存儲器訪問的非常規模式帶來的好處超過了其他任何損失。 Nvidia在它的Cublas庫中有它的GEMM API,Intel Mkl也有它自己的GEMM API。想象一下,在Cuda中進行元素卷積,內存訪問會非常不規律,以至於你的性能會非常糟糕。
反過來,
Im2col()
以一種內存訪問規則的方式排列數據。Im2col()
功能雖然增加了很多數據冗餘,但使用Gemm的性能優勢超過了這個數據冗餘。這就是在神經網絡中使用
Im2col()
操作的原因。此鏈接介紹如何
Im2col()
安排GEMM數據: https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/
相關問題
- 1. 如何在R中更快,更高效地執行此操作?
- 2. 如何使用Inception-v3作爲卷積網絡
- 3. 更高效1D卷積當過濾器大小爲1
- 4. 繪製高斯卷積圖
- 5. 卷積矩陣如何工作?
- 6. Caffe的卷積真的如何工作?
- 7. 如何使istringstream更高效?
- 8. 如何在Scilab中執行解卷積
- 9. 如何在CUDA中卷積圖像
- 10. 張流與卷積網絡
- 11. 卷積神經網絡
- 12. 深度卷積網絡
- 13. 這是在普通卷積神經網絡中進行的基本卷積嗎?
- 14. 爲什麼卷積濾波器在卷積神經網絡中翻轉?
- 15. 1D使用高斯內核進行卷積使用
- 16. 在Web應用程序中簡化並使表單/粗體操作更高效?
- 17. 卷積在Python
- 18. Tensorflow:在卷積
- 19. 咖啡完全卷積cnn - 如何使用作物參數
- 20. Weiner使用opencv解卷積
- 21. 什麼卷積操作用於圖像識別?
- 22. 做任何keras網絡卷積
- 23. 高效運行操作
- 24. 高效的ByteArrayInputStream操作
- 25. 在TensorFlow中使用輸入作爲卷積過濾器
- 26. 使用高階函數和Lambda微積分在Haskell中操作列表
- 27. 如何在Theano中使卷積中的image_shape動態化
- 28. 高斯模糊和卷積內核
- 29. 過程中使用卷積方法
- 30. 卷積神經網絡中並行和順序卷積之間的區別