卷积神经网络参数量和计算量的计算

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×k1次加法操作(将卷积结果, 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×K1)=2×K×K1
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(HK+Ph)+1)(S(WK+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) (C1)×C×(S(HK+Ph)+1)(S(WK+Pw)+1)×(2×K×K1)

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×(C1)×C×(S(HK+Ph)+1)(S(WK+Pw)+1)×(2×K×K1)
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×(C1)×C×(S(HK+Ph)+1)(S(WK+Pw)+1)×(2×K×K1)
上面的式子得到的是卷积神经网路的一层所需要的计算量,将每层的计算量相加就可以得到整个网络的计算量。通常包含乘加的操作有Pool,Relu,BN(含有除法),卷积等。一般都是卷积操作占主要。

2 参数量

CNN网络的参数量和特征图的尺寸无关,仅和卷积核的大小,偏置及BN有关,对于卷积张量kernel=(K, S, C, O),权重参数量为 K ∗ K ∗ C ∗ O K*K*C*O KKCO,偏置参数量为O,如果使用了BN,那么还有两个可学习参数 α , β \alpha, \beta α,β,参数量都是O,总共2*O,,综上,该卷积层所有的参数量为:
K ∗ K ∗ C ∗ O + 3 ∗ O K*K*C*O+3*O KKCO+3O
需要注意的是,上面计算的仅仅是模型的参数量,若要计算模型实际需要多少显存,还要考虑特征图的大小,因为每一层卷积的输出都需要缓存,还要BN计算出来的均值和偏差也需要缓存,权重的梯度也需要缓存。通常模型参数所占用的显存比例很小。

参考文章:CNN中计算量和参数的计算方法
主要的内容参考上面的博客,自己梳理了一下,认为这样写更清晰一些。

相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页