转自
深度学习之(经典)卷积层计算量以及参数量总结 (考虑有无bias,乘加情况)
对公式重新美化了一下。
目录:
- 经典的卷积层是如何计算的
- 分析卷积层的计算量
- 分析卷积层的参数量
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=⌊(H−K1+2P1)/S1⌋+1 Wout=⌊(W−K2+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×K2−1))+(Cin−1)+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×K2−1)次加法(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×K2−1)次加法,每个通道都卷积后,得到
C
i
n
C_{in}
Cin个数,接下来需要有
C
i
n
−
1
C_{in} - 1
Cin−1次加法,最后加上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×K2−1)次
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