目录:
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实现