深度學習之(經典)卷積層計算量以及參數量總結 (考慮有無bias,乘加情況)


目錄:

1、經典的卷積層是如何計算的

2、分析卷積層的計算量

3、分析卷積層的參數量

4、pytorch實現自動計算卷積層的計算量和參數量

 


 

1、卷積操作如下:

http://cs231n.github.io/assets/conv-demo/index.html

假設卷積層的輸入特征圖大小為C_in x H x W, 卷積核大小為K_1 x K_2, padding = P_1 x P_2, stride = S_1 x S_2, filter 數目為C_out。

輸出的特征圖大小為C_out x H_out x W_out, 其中

  H_out = [(H - K_1 + 2P_1) / S_1] + 1

  W_out = [(W - K_2 + 2P_2) / S_2] + 1

[]表示向下取整。

 


 

2、計算量分析

 

只考慮乘法計算量:

為了得到輸出的特征圖的某一個位置的像素值,需要 C_in x K_1 x K_2次乘法操作,而特征圖總共有C_out x H_out x W_out個像素,因此總計算量為

                    C_out x H_out x W_out x ( C_in x K_1 x K_2)

 

同時考慮乘法和加法計算量:

1)bias=true,即考慮偏置的情況

乘法操作計算量:

為了得到輸出的特征圖的某一個位置的像素值,需要 C_in x K_1 x K_2 次乘法操作,而特征圖總共有C_out x H_out x W_out個像素,因此總計算量為

                    C_out x H_out x W_out x ( C_in x K_1 x K_2)

加法操作計算量:

為了得到輸出的特征圖的某一個位置的像素值,需要 (C_in x (K_1 x K_2 - 1)) + (C_in - 1) + 1  = C_in x K_1 x K_2 次加法操作,可以看成三部分,第一部分表示在某一個通道進行一個K_1 x K_2 大小的卷積操作需要 (K_1 x K_2 - 1)次加法,有C_in個通道,故 C_in x (K_1 x K_2 - 1)次加法,每個通道都卷積后,得到C_in個數,接下來需要有 C_in - 1次加法,最后加上bias又1次加法。 而特征圖總共有C_out x H_out x W_out個像素,因此總加法計算量為

                    C_out x H_out x W_out x ( C_in x K_1 x K_2)

 

因此綜上所述,乘加法計算量為 2 x  C_out x H_out x W_out x (C_in x K_1 x K_2)

 

Note that:

當前一般浮點操作數(flops),一般只看卷積乘法以及加上bias的一次加法。

bias=true, flops = C_out x H_out x W_out x ( C_in x K_1 x K_2 + 1)

bias=false, flops= C_out x H_out x W_out x ( C_in x K_1 x K_2)

 

2)bias=false,不考慮偏置情況。根據上述分析,無bias情況下乘加法計算量為C_out x H_out x W_out x (2 x C_in x K_1 x K_2 - 1)

 


 

3、參數量分析

卷積核參數量:

C_out x C_in x K_1 x K_2

bias參數量:

C_out

因此總參數量為 C_out x C_in x K_1 x K_2 + C_out

 


 

4、pytorch實現


免責聲明!

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



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