目錄:
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實現