面经:卷积层计算量

转自
深度学习之(经典)卷积层计算量以及参数量总结 (考虑有无bias,乘加情况)
对公式重新美化了一下。

目录:

  1. 经典的卷积层是如何计算的
  2. 分析卷积层的计算量
  3. 分析卷积层的参数量

1、卷积操作如下:

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

假设卷积层的输入特征图大小为 C i n × H × W C_{in} \times H \times W Cin×H×W, 卷积核大小为 K 1 × K 2 K_1 \times K_2 K1×K2, padding = P 1 × P 2 P_1 \times P_2 P1×P2, stride = S 1 × S 2 S_1 \times S_2 S1×S2, filter 数目为 C o u t C_{out} Cout

输出的特征图大小为 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout×Hout×Wout, 其中
    H o u t = ⌊ ( H − K 1 + 2 P 1 ) / S 1 ⌋ + 1     W o u t = ⌊ ( W − K 2 + 2 P 2 ) / S 2 ⌋ + 1   H_{out} = \lfloor (H - K_1 + 2P_1) / S_1\rfloor + 1 \\   W_{out} = \lfloor (W - K_2 + 2P_2) / S_2\rfloor + 1   Hout=(HK1+2P1)/S1+1  Wout=(WK2+2P2)/S2+1
⌊ ⋅ ⌋ \lfloor \cdot\rfloor 表示向下取整。

2、计算量分析

只考虑乘法计算量:

为了得到输出的特征图的某一个位置的像素值,需要 C i n × K 1 × K 2 C_{in} \times K_1 \times K_2 Cin×K1×K2次乘法操作(三维的卷积),而特征图总共有 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout×Hout×Wout个像素,因此总计算量为
C o u t × H o u t × W o u t × ( C i n × K 1 × K 2 ) C_{out} \times H_{out} \times W_{out} \times ( C_{in} \times K_1 \times K_2) Cout×Hout×Wout×(Cin×K1×K2)

同时考虑乘法和加法计算量:

1)bias=true,即考虑偏置的情况

乘法操作计算量:

为了得到输出的特征图的某一个位置的像素值,需要 C i n × K 1 × K 2 C_{in} \times K_1 \times K_2 Cin×K1×K2次乘法操作,而特征图总共有 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout×Hout×Wout个像素,因此总计算量为
C o u t × H o u t × W o u t × ( C i n × K 1 × K 2 ) C_{out} \times H_{out} \times W_{out} \times ( C_{in} \times K_1 \times K_2) Cout×Hout×Wout×(Cin×K1×K2)
加法操作计算量:

为了得到输出的特征图的某一个位置的像素值,需要 C i n × ( K 1 × K 2 − 1 ) ) + ( C i n − 1 ) + 1 = C i n × K 1 × K 2 C_{in} \times (K_1 \times K_2 - 1))+ (C_{in} - 1) + 1 = C_{in} \times K_1 \times K_2 Cin×(K1×K21))+(Cin1)+1=Cin×K1×K2次加法操作,可以看成三部分,第一部分表示在某一个通道进行一个 K 1 × K 2 K_1 \times K_2 K1×K2 大小的卷积操作需要 ( K 1 × K 2 − 1 ) (K_1 \times K_2 - 1) (K1×K21)次加法(n个数的和只需n-1次加法),有 C i n C_{in} Cin个通道,故 C i n × ( K 1 × K 2 − 1 ) C_{in} \times (K_1\times K_2 - 1) Cin×(K1×K21)次加法,每个通道都卷积后,得到 C i n C_{in} Cin个数,接下来需要有 C i n − 1 C_{in} - 1 Cin1次加法,最后加上bias又1次加法。 而特征图总共有 C o u t × H o u t × W o u t C_{out} \times H_{out} \times W_{out} Cout×Hout×Wout个像素,因此总加法计算量为
C o u t × H o u t × W o u t × ( C i n × K 1 × K 2 ) C_{out} \times H_{out} \times W_{out} \times ( C_{in} \times K_1 \times K_2) Cout×Hout×Wout×(Cin×K1×K2)

因此综上所述,乘加法计算量为 2 × C o u t × H o u t × W o u t × ( C i n × K 1 × K 2 ) 2 \times C_{out} \times H_{out} \times W_{out} \times ( C_{in} \times K_1 \times K_2) 2×Cout×Hout×Wout×(Cin×K1×K2)

Note that:

当前一般浮点操作数(flops),一般只看卷积乘法以及加上bias的一次加法。

bias=true, flops = C o u t × H o u t × W o u t × ( C i n × K 1 × K 2 + 1 ) \text{flops} = C_{out} \times H_{out} \times W_{out} \times ( C_{in} \times K_1 \times K_2 + 1) flops=Cout×Hout×Wout×(Cin×K1×K2+1)

bias=false, flops = C o u t × H o u t × W o u t × ( C i n × K 1 × K 2 ) \text{flops}= C_{out} \times H_{out} \times W_{out} \times ( C_{in} \times K_1 \times K_2) flops=Cout×Hout×Wout×(Cin×K1×K2)

2)bias=false,不考虑偏置情况。

根据上述分析,无bias情况下乘加法计算量为 C o u t × H o u t × W o u t × ( 2 × C i n × K 1 × K 2 − 1 ) C_{out} \times H_{out} \times W_{out} \times ( 2 \times C_{in} \times K_1 \times K_2 - 1) Cout×Hout×Wout×(2×Cin×K1×K21)

3、参数量分析

卷积核参数量:
C o u t × C i n × K 1 × K 2 C_{out} \times C_{in} \times K_1 \times K_2 Cout×Cin×K1×K2
bias参数量:
C o u t C_{out} Cout
因此总参数量为 C o u t × C i n × K 1 × K 2 + C o u t C_{out} \times C_{in} \times K_1 \times K_2 + C_{out} Cout×Cin×K1×K2+Cout

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值