回答

2
  1. 嗯,你在想以正確的方式,在亞歷克斯淨近95%的GPU時間和CPU時間的89%都花在卷積層和完全連接層。

  2. 卷積層和完全連接層是使用GEMM實現的,GEMM代表矩陣乘法矩陣。

  3. 因此,基本上在GEMM中,我們通過使用函數im2col()將卷積轉換爲矩陣乘法,該函數以可通過矩陣乘法實現卷積輸出的方式排列數據。

  4. 現在,您可能會有一個問題,而不是直接進行元素卷積,爲什麼我們要在兩者之間添加一個步驟以不同方式排列數據,然後使用GEMM。

  5. 答案是這樣的,科學程序員已經花了幾十年時間來優化代碼以執行大矩陣到矩陣乘法,並且存儲器訪問的非常規模式帶來的好處超過了其他任何損失。 Nvidia在它的Cublas庫中有它的GEMM API,Intel Mkl也有它自己的GEMM API。想象一下,在Cuda中進行元素卷積,內存訪問會非常不規律,以至於你的性能會非常糟糕。

  6. 反過來,Im2col()以一種內存訪問規則的方式排列數據。

  7. Im2col()功能雖然增加了很多數據冗餘,但使用Gemm的性能優勢超過了這個數據冗餘。

  8. 這就是在神經網絡中使用Im2col()操作的原因。

  9. 此鏈接介紹如何Im2col()安排GEMM數據: https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/