剪辑自:https://zhuanlan.zhihu.com/p/57437131

参数量就是指,模型所有带参数的层的权重参数总量。视觉类网络组件中带参数的层,主要有:卷积层、BN层、全连接层等。(注意:激活函数层(relu等)和Maxpooling层、Upsample层是没有参数的,不需要学习,他们只是提供了一种非线性的变换,BN时对batch计算的mean和sigma也要存储,这个占空间但不算参数)

1. 理论公式部分

  • 卷积层神经网络参数量的计算:以UNet为例 - 图1

其中 神经网络参数量的计算:以UNet为例 - 图2为卷积核大小, 神经网络参数量的计算:以UNet为例 - 图3为输入channel数, 神经网络参数量的计算:以UNet为例 - 图4为输出的channel数(也是filter的数量),算式第二项是偏置项的参数量 。(虽然一般不写偏置项,因为不会影响总参数量的数量级,但是我们为了准确起见,把偏置项的参数量也考虑进来)

  • BN层神经网络参数量的计算:以UNet为例 - 图5 ,其中 神经网络参数量的计算:以UNet为例 - 图6 为输入的channel数

(BN层有两个需要学习的参数,平移因子和缩放因子)

  • 全连接层神经网络参数量的计算:以UNet为例 - 图7

神经网络参数量的计算:以UNet为例 - 图8 为输入向量的长度, 神经网络参数量的计算:以UNet为例 - 图9 为输出向量的长度,其中第二项为偏置项参数量。 (不过目前全连接层已经逐渐被Global Average Pooling层取代了)

我们将以UNet为例,来实践一下参数量的计算。

2. 实践部分

我们首先摆出经典的UNet结构图。
神经网络参数量的计算:以UNet为例 - 图10

我们把UNet共分为5个Stage,分别计算每个stage的参数量。每个stage的filter数量为[32,64,128,256,512],相比于UNet原文,我们把UNet的channel数缩小了两倍,大多数论文也的确是这么做的。同时,我们设置UNet上采样方式为TransposeConv(转置卷积),并在每个 神经网络参数量的计算:以UNet为例 - 图11Conv后加入BN层。最后假定,原始输入channel为1,输出分割图为两类(含背景),这样最终得到我们要计算参数量的UNet。

这样定义的UNet主要有四个组件, 神经网络参数量的计算:以UNet为例 - 图12Conv, 神经网络参数量的计算:以UNet为例 - 图13Conv,TransposeConv和BN层。

我们先计算Conv,再计算BN层。

Stage1: 神经网络参数量的计算:以UNet为例 - 图14

Stage2:
神经网络参数量的计算:以UNet为例 - 图15

Stage3:
神经网络参数量的计算:以UNet为例 - 图16

Stage4:
神经网络参数量的计算:以UNet为例 - 图17

Stage5:
神经网络参数量的计算:以UNet为例 - 图18

TransposeConv:
神经网络参数量的计算:以UNet为例 - 图19

目前为止,我们把以上所有Conv得到的参数量求和 ,得到了没有加BN的UNet参数量。神经网络参数量的计算:以UNet为例 - 图20

接下来,我们计算BN层的参数量,易得:
神经网络参数量的计算:以UNet为例 - 图21

和刚求得的参数量求和, 神经网络参数量的计算:以UNet为例 - 图22

加入了BN的UNet参数量为7765442。

我们得到的两种UNet的参数量,如何验证其正确性呢?或者说我们不可能每次都手动计算这些网络的参数量,这就需要脚本去帮我们去计算网络的参数量。代码如下:

  1. def count_param(model):
  2. param_count = 0
  3. for param in model.parameters():
  4. param_count += param.view(-1).size()[0]
  5. return param_count

我们通过项目【UNet-family】中提供的脚本,可以直接使用命令python UNet.py来计算网络的参数量。通过设置参数is_batchnorm我们得到两次计算结果如下:

有BN:
神经网络参数量的计算:以UNet为例 - 图23

没有BN:
神经网络参数量的计算:以UNet为例 - 图24

赶快看一眼我们之前算的参数量,一模一样,说明我们算的没毛病。

有没有一种再也不怕面试官问自己参数量计算的感觉。

3. 拓展延伸

我把几种UNet变形的参数量列举如下,大家也可以自己验证。
神经网络参数量的计算:以UNet为例 - 图25

(其中Feature Scale是指channel的scale相对于原始UNet降了几倍,如果Feature scale为2,则filter的数量为[32,64,128,256,512])

4. 留个作业可好

最后,留个小实践,大家可以去计算下UNet++的参数量,看和论文中是不是一致?
神经网络参数量的计算:以UNet为例 - 图26

附上我自己计算的结果。
神经网络参数量的计算:以UNet为例 - 图27


参考链接:

  1. 卷积神经网络的复杂度分析
  2. Batch Normalization原理与实战