CNN中parameters和FLOPs计算

CNN中parameters和FLOPs计算

以AlexNet为例,先注意观察每层编注的通道数的变化。
在这里插入图片描述1. 卷积网络的参数量的计算(parameters)

CNN中的parameters分为两种:W和b,注意这里W是大写,表示一个矩阵,也因此它相比 b,既含有更多的信息,同时也是parameters的主要部分。

在AlexNet模型结构图中,每个大长方体中的小长方体就是W,它是大小为[K_h, K_w, C_{in}]的三维矩阵,其中

  • K_h为卷积核(filter或kernel)的高度,
  • K_w为卷积核的宽度,
  • C_{in}为输入的通道数(Channels),
    一般情况下,K_h和K_w的大小是一样的,且一般比较小,3、5、7之类。

每个卷积核在输入数据上从左往右、从上往下扫一遍,便会计算出很多个前向传播的值,这些值就会按原来相对位置拼成一个feature map,由於单个卷积核提取的信息太过有限,于是需要N个不同的卷积核各扫数据,会产生N个feature map,这N个feature map在拼在一起就是这一层的输出,即更“厚”的一个长方体。输出的高度和宽度分别为h, w,同时N就是输出的通道数,记作C_{out},则输出矩阵大小为[h, w, C_{out}}]。
例如在从AlexNet图中左边第一个大长方体(如输入的图片)到第二个大长方体(图中是两个并列小长方体,这是作者分布式训练的需要,分析时可以将二者并起来看,即C_{out}=48*2)这个过程,即是从[in_h, in_w, C_{in}] = [224, 224, 3]的矩阵,经过[K_h, K_w, C_{in}] = [11, 11, 3]的卷积核,变为[out_h, out_w, C_{out}] = [55, 55, 96]的矩阵的过程。

对于偏置参数 b,从前向传播公式可以看出,和W(这里的W是权值矩阵)是一对一的关系,b的个数(维度)也和W是对应的,即[C_{out}, ],例如对于AlexNet的第一个卷积层,parameters中偏置的个数为number(b)=C_{out} = 96。

于是可以得出对于某一个卷积层,它的parameters个数为:
parameters
(K_h * K_w * C_{in}) * C_{out} + C_{out}

对于全连接层,比如AlexNet的后三层,相对更简单,因为是变成了两组一维数据之间的两两连接相乘(如上图第5层到第6层,卷积层过度到全连接层,会先将第5层三维数据flatten为一维,参数的总个数未变),然后加上一个偏置即可。所以对于某个全连接层,如果输入的数据有N_{in}个节点,输出的数据有N_{out}个节点,它的parameters个数为:N_{in} * N_{out} + N_{out}。如果上层是卷积层,**N_{in}**就是上层的输出三维矩阵元素个数,即三个维度相乘。

注意:Tensorflow使用卷积核的时候,使用的格式是[k_h,k_w,in_c,out_c]。

2. FLOPs(floating point operations),浮点运算次数

  • FLOPS: 全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。(硬件)
  • FLOPs: s小写,指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。(模型) 在论文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)
    2017年,ICIR收录了NVIDIA发表的一篇论文,详细的讲解了一下FLOPs的计算。

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
这个过程中的浮点运算主要就是W相关的乘法,以及b相关的加法,每一个W对应中K_h*K_w个乘法,每一个b对应一个加法,看起来FLOPs个数和parameters是相同的。但实际上每个feature map上每个点的权值是共享,这是CNN的一个重要特性,也可以说是优势(因此才获得特征不变性,以及大幅减少参数数量),我们在计算FLOPs是在parameters的基础上需要再乘以feature map的大小即可,对于某个卷积层,它的FLOPs数量为:
[(K_h * K_w * C_{in}) * C_{out} + C_{out}] * (H * W) = num_params * (H * W),其中num_params表示该层参数的数目。

还是里AlexNet网络第一卷积层为例,它的FLOPs数目为: [(11 * 11 * 3) * 96 + 96] * (55 * 55) = 105,705,600。
对于全连接层,由于不存在权值共享,它的FLOPs数目即是该层参数数目:
N_{in} * N_{out} + N_{out}
注意:
不能只用FLOPs作为指标呢,有如下几个原因:
1.FLOPs没有考虑几个对速度有相当大影响的重要因素。
2.计算平台的不同会导致结果不同。
FLOPs没有考虑几个对速度有相当大影响的重要因素:MAC和并行度

推荐用来计算pytorch构建的网络的参数,空间大小,MAdd,FLOPs等指标,简单好用。
flops-counter.pytorch
torchstat

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章