CNN参数量和计算量的计算
2020-03-29 本文已影响0人
geekboys
我们在设计一个CNN网络时,一定要考虑的两个事情,一个是这个网络需要的计算量有多大,一个是这个模型的参数量有多少。计算量决定网络训练的快慢(硬件设备确定的情况),参数量决定计算设备需要多大的内存或显存。CNN的计算量以计算机做乘加次数为单位,即完成某个操作,需要执行多少次乘法和加法操作。参数量以参数个数为单位,要计算内存或显存的,用参数量乘以每个参数所占的字节数即可。
1.计算量
对于输入特征图f=(B,H,W,C),卷积核张量kernel=(K,S,C,O),其中,B是batch size大小,H,W,C分别是输入特征图的高,宽和通道数。K,S,C,O分别是卷积操作时,卷积核的大小,移动步长(stride),特征图输入通道及输出通道数。
- 首先一次卷积的计算量
一个kk的卷积,执行一次卷积操作,需要kk次乘法操作(卷积核中每个参数都要和特征图上的元素相乘一次),kk-1次加法操作(将卷积结果,kk个数加起来)。所以,一次卷积操作需要的乘加次数:(KK)+(KK-1)=2KK-1 - 在一个特征图上执行卷积需要进行卷积的次数:
在一个特征图上需要执行的卷积次数:(((H-K+Ph)/S)+1)*(((W-K+Pw)/S)+1),Pw,Ph表示在高和宽方向填充的像素。 - C个特征图上进行卷积运算的次数
C个输入特征图上进行卷积运算的次数为C - 输出一个特征图通道需要的加法次数
在C个输入特征图上进行卷积之后需要将卷积的结果相加,得到一个输出特征图上的卷积结果,C个相加需要C-1次加法,所以输出一个特征图的计算量是:
(C-1)C((H-K+Ph)/S+1)((W-K+Pw)/S+1)(2KK-1) - 输出O个特征图需要计算的次数
上面的结果要乘到的是一个通道需要的计算量,需要输出O个通道,计算量还要乘以O,所以O个特征图需要的计算量为:
O(C-1)C((H-K+Ph)/S+1)((W-K+Pw)/S+1)(2K*K-1) - 一个batch的样本需要的计算量
上面是一个样本的数据需要的计算量,每个样本都需要进行卷积运算,所以一个batch的样本需要的计算量为:
BO(C-1)C((H-K+Ph)/S+1)((W-K+Pw)/S+1)(2KK-1)
上面的算式得到的是CNN一层所需要的计算量,将每层的计算量相加就可以得到整个网络的计算量。通常包含乘加的操作有Pool,Relu,BN(含有除法),卷积等。一般都是卷积操作占主要。
2.参数量
CNN网络的参数量和特征图的尺寸无关,仅和卷积核的大小,偏置及BN有关,对于卷积张量kernel=(K,S,C,O),权重参数量为KKCO,偏置参数量为O,如果使用BN,那么还有两个可学习参数 a,b,参数量都是O,总共2O,终上所述,该卷积层所有的参数量为:
KKCO+3O
需要注意的是,上面计算的仅仅是模型的参数量,若要计算模型实际需要多少显存,还要考虑特征图的大小,因为每一层卷积的输出都需要缓存,还要BN计算出来的均值和偏差也需要缓存,权重的梯度也需要缓存。通常模型参数所占用的显存比例很小。