0 前言
我们在设计一个CNN网络时,通常要考虑两个事情,一个是这个网络需要的计算量有多大,一个是这个模型的参数量有多少。前者决定了网络训练的快慢(硬件设备确定的情况),后者决定了计算设备需要多大的内存或显存。
本文CNN的计算量以计算机做乘加次数为单位,即完成某个操作,需要执行多少次乘法和加法操作。参数量以参数个数为单位,要计算内存或显存的,用参数量乘以每个参数所占的字节数即可。
1 计算量
对于输入特征图f=(B,H,W,C),卷积核张量kernel=(K,S,C,O),其中,B是batch size大小,H,W,C分别是输入特征图的高,宽和通道数,K,S,C,O分别是卷积操作时,卷积核的大小,移动步长(stride),特征图输入通道及输出通道数。先分开来看一下一个数据样本每一小步需要的计算次数:
1. 首先一次卷积的计算量:
一个
k
×
k
k\times k
k×k的卷积,执行一次卷积操作,需要
k
×
k
k\times k
k×k次乘法操作(卷积核中每个参数都要和特征图上的元素相乘一次),
k
×
k
−
1
k\times k-1
k×k−1次加法操作(将卷积结果,
k
×
k
k\times k
k×k个数加起来)。所以,一次卷积操作需要的乘加次数:
(
K
×
K
)
+
(
K
×
K
−
1
)
=
2
×
K
×
K
−
1
(K \times K)+(K \times K-1)=2\times K \times K-1
(K×K)+(K×K−1)=2×K×K−1
2. 在一个特征图上执行卷积需要进行卷积的次数:
在一个特征图上需要执行的卷积次数:
(
(
H
−
K
+
P
h
)
S
+
1
)
∗
(
(
W
−
K
+
P
w
)
S
+
1
)
,
P
h
,
P
w
(\frac{(H-K+P_h)}{S}+1)*(\frac{(W-K+P_w)}{S}+1),P_h,P_w
(S(H−K+Ph)+1)∗(S(W−K+Pw)+1),Ph,Pw表示在高和宽方向填充的像素,此处假定了宽高方向滑动步长和核的宽高是一样,若不同,调整一下值即可。若不能整除,可向下取整。
3. C个特征图上进行卷积运算的次数
C个输入特征图上进行卷积运算的次数为C
4. 输出一个特征图通道需要的加法次数
在C个输入特征图上进行卷积之后需要将卷积的结果相加,得到一个输出特征图上卷积结果,C个相加需要C-1次加法,所以输出一个特征图需要的计算量是
(
C
−
1
)
×
C
×
(
(
H
−
K
+
P
h
)
S
+
1
)
∗
(
(
W
−
K
+
P
w
)
S
+
1
)
×
(
2
×
K
×
K
−
1
)
(C-1) \times C \times (\frac{(H-K+P_h)}{S}+1)*(\frac{(W-K+P_w)}{S}+1) \times(2 \times K \times K-1)
(C−1)×C×(S(H−K+Ph)+1)∗(S(W−K+Pw)+1)×(2×K×K−1)
5. 输出O个特征图需要计算的次数
上面的结果想乘的到的是输出一个通道需要的计算量,需要输出O个通道,计算量还要乘以O,所以输出O个特征图需要的计算量为
O
×
(
C
−
1
)
×
C
×
(
(
H
−
K
+
P
h
)
S
+
1
)
∗
(
(
W
−
K
+
P
w
)
S
+
1
)
×
(
2
×
K
×
K
−
1
)
O \times (C-1) \times C \times (\frac{(H-K+P_h)}{S}+1)*(\frac{(W-K+P_w)}{S}+1) \times(2 \times K \times K-1)
O×(C−1)×C×(S(H−K+Ph)+1)∗(S(W−K+Pw)+1)×(2×K×K−1)
6. 一个batch的样本需要的计算量
上面是一个样本的数据需要的计算量,每个样本都需要就行卷积运算,所以一个batch的样本需要的计算量为:
B
×
O
×
(
C
−
1
)
×
C
×
(
(
H
−
K
+
P
h
)
S
+
1
)
∗
(
(
W
−
K
+
P
w
)
S
+
1
)
×
(
2
×
K
×
K
−
1
)
B \times O \times (C-1) \times C \times (\frac{(H-K+P_h)}{S}+1)*(\frac{(W-K+P_w)}{S}+1) \times(2 \times K \times K-1)
B×O×(C−1)×C×(S(H−K+Ph)+1)∗(S(W−K+Pw)+1)×(2×K×K−1)
上面的式子得到的是卷积神经网路的一层所需要的计算量,将每层的计算量相加就可以得到整个网络的计算量。通常包含乘加的操作有Pool,Relu,BN(含有除法),卷积等。一般都是卷积操作占主要。
2 参数量
CNN网络的参数量和特征图的尺寸无关,仅和卷积核的大小,偏置及BN有关,对于卷积张量kernel=(K, S, C, O),权重参数量为
K
∗
K
∗
C
∗
O
K*K*C*O
K∗K∗C∗O,偏置参数量为O,如果使用了BN,那么还有两个可学习参数
α
,
β
\alpha, \beta
α,β,参数量都是O,总共2*O,,综上,该卷积层所有的参数量为:
K
∗
K
∗
C
∗
O
+
3
∗
O
K*K*C*O+3*O
K∗K∗C∗O+3∗O
需要注意的是,上面计算的仅仅是模型的参数量,若要计算模型实际需要多少显存,还要考虑特征图的大小,因为每一层卷积的输出都需要缓存,还要BN计算出来的均值和偏差也需要缓存,权重的梯度也需要缓存。通常模型参数所占用的显存比例很小。
参考文章:CNN中计算量和参数的计算方法
主要的内容参考上面的博客,自己梳理了一下,认为这样写更清晰一些。