文章目录


本文是对卷积神经网络模型参数量和浮点运算量的计算推导公式和方法,使用 API 自动计算这些数据请移步另一篇博客:自动计算模型参数量、FLOPs、乘加数以及所需内存等数据

1. 对 CNN 而言,每个卷积层的参数量计算如下:

params = C_o × (k_w × k_h × C_i +1)

其中C_o 表示输出通道数,C_i 表示输入通道数,k_w 表示卷积核宽,k_h 表示卷积核高。
括号内的w × h × C_i 表示一个卷积核的权重数量,+1 表示 bias,括号表示一个卷积核的参数量,C_o × 表示该层有C_o 个卷积核。

若卷积核是方形的,即k_w = k_h = k,则上式变为:

params = C_o × (k^2 × C_i +1)

需要注意的是,使用 Batch Normalization 时不需要 bias,此时计算式中的 + 1 项去除。

2. 对 CNN 而言,每个卷积层的运算量计算如下:

FLOPs = [(C_i × k_w × k_h) + (C_i × k_w × k_h - 1) + 1] × C_o × W × H

FLOPs 是英文 floating point operations 的缩写,表示浮点运算量,中括号内的值表示卷积操作计算出 feature map 中一个点所需要的运算量(乘法和加法),C_i × k_w × k_h 表示一次卷积操作中的乘法运算量,C_i × k_w × k_h - 1 表示一次卷积操作中的加法运算量,+ 1 表示 bias,W 和 H 分别表示 feature map 的长和宽,× C_o × W × H 表示 feature map 的所有元素数。
若是方形卷积核,即k_w = k_h = k,则有:

FLOPs = 2 × C_i × k^2 × C_o × W × H

上面是乘运算和加运算的总和,将一次乘运算或加运算都视作一次浮点运算。
在计算机视觉论文中,常常将一个‘乘 - 加’组合视为一次浮点运算,英文表述为’Multi-Add’,运算量正好是上面的算法减半,此时的运算量为:

FLOPs = C_i × k^2 × C_o × W × H

3. 对全连接层而言,其参数量非常容易计算:

params = (I + 1) × O = I×O + O

值得注意的是,最初由 feature map flatten 而来的向量视为第一层全连接层,即此处的I
可以这样理解上式:每一个输出神经元连接着所有输入神经元,所以有I 个权重,每个输出神经元还要加一个 bias。
也可以这样理解:每一层神经元 (O 这一层) 的权重数为I×O,bias 数量为 O

4. 对全连接层而言,其运算量计算如下:

FLOPs = [I + (I-1) +1]×O = (2 × I) × O

其中 I = input\ nerons, O = output\ nerons
中括号的值表示计算出一个神经元所需的运算量,第一个I 表示乘法运算量,I-1 表示加法运算量,+1 表示 bias,×O 表示计算 O 个神经元的值。

× 请我吃糖~
打赏二维码