神经网络中常用算子参数量和计算量估计

这是一个副标题

在学习机器学习和神经网络过程中,对于模型参数和模型计算量需要做出评估,这篇文章介绍几种常见操作对模型带来的参数量和计算量,更专业的表示为空间复杂度和时间复杂度,后续再补充。

注意:下面计算的是都是单层参数量计算量,并且是对于一个样本的计算量,如果计算批量样本,需要给下面计算量乘以BatchSize

卷积层

卷积运算的参数量

计算公式:$parameter = (k_{w} \times k_{h} \times C_{in} + 1 )\times filter\ number$;
即:$参数量\ =(kernal_wide \times kernal_high \times 输入的特征图的通道数 + 偏置 )\times 当前层filter数量$;
以VGG-16模型的Conv1-1卷积为例,输入$224 \times 224 \times 3$,有$64$个$3 \times 3$大小filter,输出feature map为$224 \times 224 \times 64$,那么该层具有的参数量为:$(3 \times 3 \times 3 + 1)\times 64 = 1792$

卷积运算的计算量

  • FLOPs(Floating Point Operations),浮点运算次数,用来衡量算法的时间复杂度;
  • FLOPS(Floating Point Operations per Seconds),单位时间浮点运算次数,用来衡量硬件计算性能。

$FLOPs=\left[\left(C_{i n} \times k_{w} \times k_{h}\right)+\left(C_{i n} \times k_{w} \times k_{h}-1\right)+1\right] \times C_{o u t} \times W_{out} \times H_{out}$
$k_{w}$ 和 $k_{h}$ 分别表示卷积核的宽和高,其中 $C_{i n} \times k_{w} \times k_{h}$ 表示乘法计算量, $C_{i n} \times k_{w} \times k_{h}-1$ 表示加法计算量(可以这样理解,需要把乘法计算得到的$C_{i n} \times k_{w} \times k_{h}$个数字加这么多次), $+1$ 表示偏置, $C_{\text {out }} \times W_{out} \times H_{out}$ 表示 feature $\operatorname{map}$ 中的所有元素, $W_{out} \text{、} H_{out}$ 表示feature map的宽和高。

全连接层

全连接运算的参数量

计算公式: $parameter =\left(N_{i n}+1\right) \times N_{\text {out }}$
$N_{i n}$ 表示输入特征向量的维数, +1表示偏置, $N_{out}$ 表示输出向量的维数

全连接运算的计算量

$FLOPs=[N_{in}+(N_{in}-1)+1] \times N_{out}$
$N_{in}$ 和 $N_{out}$ 分别表示输入的特征数和输出的特征数。
其中$N_{in}$表示乘法运算量, $N_{in}-1$ 表示加法运算量,+1表示偏置。

池化层

池化层运算的参数量

无参数。

池化层运算的计算量

$FLOPs=C_{out} \times H_{out} \times W_{out} \times k \times k$
$k \times k$ 代表在原特征图区域$k \times k$ 的 max ,sum或者avg池化操作;
$H_{out} \times W_{out}$代表输出特征图大小,$C_{out}$代表输出通道数。

案例

参数量

VGG-19模型,输入图片大小为$3 \times 224 \times 224$,表示为$3$通道$224 \times 224$尺寸的图像输入,模型分为五组卷积和三层全连接层。

$(3 \times 3 \times 3 + 1) \times 64 + (3 \times 3 \times 64 + 1) \times 64 + (3 \times 3 \times 64 + 1) \times 128 + (3 \times 3 \times 128 + 1) \times 128 +$ $(3 \times 3 \times 128 + 1) \times 256 + (3 \times 3 \times 256 + 1) \times 256 + (3 \times 3 \times 256 + 1) \times 256 + (3 \times 3 \times 256 + 1) \times 256 +$ $(3 \times 3 \times 256 + 1) \times 512 + (3 \times 3 \times 512 + 1) \times 512 + (3 \times 3 \times 512 + 1) \times 512 + (3 \times 3 \times 512 + 1) \times 512 +$ $(3 \times 3 \times 512 + 1) \times 512 + (3 \times 3 \times 512 + 1) \times 512 + (3 \times 3 \times 512 + 1) \times 512 + (3 \times 3 \times 512 + 1) \times 512 +$ $(512 \times 7 \times 7 + 1) \times 4096 + (4096 + 1) \times 4096 + (4096 + 1) \times 1000$
计算得143667240,乘以一个浮点数占4个字节,得574668960字节,为548.04MB,和论文中的数量大致相等。

计算量

VGG-19模型,输入图片大小为$3 \times 224 \times 224$,表示为$3$通道$224 \times 224$尺寸的图像输入,模型分为五组卷积和三层全连接层。

  • 第一组卷积
    • $(3 \times 3 \times 3 + 3 \times 3 \times 3 - 1 + 1) \times 64 \times 224 \times 224 = 173408256$
    • $(64 \times 3 \times 3 + 64 \times 3 \times 3 - 1 + 1) \times 64 \times 224 \times 224 = 3699376128$
  • 池化
    • $64 \times 112 \times 112 \times 2 \times 2 = 3211264$
  • 第二组卷积
    • $(64 \times 3 \times 3 + 64 \times 3 \times 3 - 1 + 1) \times 128 \times 112 \times 112 = 1849688064$
    • $(128 \times 3 \times 3 + 128 \times 3 \times 3 - 1 + 1) \times 128 \times 112 \times 112 = 3699376128$
  • 池化
    • $128 \times 56 \times 56 \times 2 \times 2 = 1605632$
  • 第三组卷积
    • $(128 \times 3 \times 3 + 128 \times 3 \times 3 - 1 + 1) \times 256 \times 56 \times 56 = 1849688064$
    • $(256 \times 3 \times 3 + 256 \times 3 \times 3 - 1 + 1) \times 256 \times 56 \times 56 = 3699376128$
    • $(256 \times 3 \times 3 + 256 \times 3 \times 3 - 1 + 1) \times 256 \times 56 \times 56 = 3699376128$
    • $(256 \times 3 \times 3 + 256 \times 3 \times 3 - 1 + 1) \times 256 \times 56 \times 56 = 3699376128$
  • 池化
    • $256 \times 28 \times 28 \times 2 \times 2 = 802816$
  • 第四组卷积
    • $(256 \times 3 \times 3 + 256 \times 3 \times 3 - 1 + 1) \times 512 \times 28 \times 28 = 1849688064$
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 28 \times 28 = 3699376128$
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 28 \times 28 = 3699376128$
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 28 \times 28 = 3699376128$
  • 池化
    • $512 \times 14 \times 14 \times 2 \times 2 = 401408$
  • 第五组卷积
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 14 \times 14 = 924844032$
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 14 \times 14 = 924844032$
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 14 \times 14 = 924844032$
    • $(512 \times 3 \times 3 + 512 \times 3 \times 3 - 1 + 1) \times 512 \times 14 \times 14 = 924844032$
  • 池化
    • $512 \times 7 \times 7 \times 2 \times 2 = 100352$
  • 第一个全连接层
    • $(512 \times 7 \times 7 + 512 \times 7 \times 7 - 1 + 1) \times 4096 = 205520896$
  • 第二个全连接层
    • $(4096 + 4096 - 1 + 1) * 4096 = 33554432$
  • 第三个全连接层
    • $(4096 + 4096 - 1 + 1) * 1000 = 8192000$
  • 共计:39264124928 = 39.2 bilion次运算,将这个值换算为multiply-adds运算,需要除以2,得到19.6bilion,该值与论文中的计算量一致。(此次运算忽略了ReLu激活层的计算量,该计算量较小,可以忽略)

工具

torchinfo

torchinfo 该工具可以自动统计网络模型的参数量和计算量。

例子:

1
2
3
4
5
from torchinfo import summary

model = ConvNet()
batch_size = 16
summary(model, input_size=(batch_size, 1, 28, 28))

结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
==========================================================================================
Layer (type:depth-idx)                   Output Shape              Param #
==========================================================================================
├─Conv2d: 1-1                            [16, 10, 24, 24]          260
├─Conv2d: 1-2                            [16, 20, 8, 8]            5,020
├─Dropout2d: 1-3                         [16, 20, 8, 8]            --
├─Linear: 1-4                            [16, 50]                  16,050
├─Linear: 1-5                            [16, 10]                  510
==========================================================================================
Total params: 21,840
Trainable params: 21,840
Non-trainable params: 0
Total mult-adds (M): 7.69
==========================================================================================
Input size (MB): 0.05
Forward/backward pass size (MB): 0.91
Params size (MB): 0.09
Estimated Total Size (MB): 1.05
==========================================================================================

参考:

https://zhuanlan.zhihu.com/p/135861716
https://zhuanlan.zhihu.com/p/49842046
https://zhuanlan.zhihu.com/p/31575074

更新记录

增加网络模型统计工具,自动进行网络参数和计算量统计。 —— 2022.07.19

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计