网络中的参数量(param)和浮点计算量(FLOPs)的计算
一、网络中的参数量(param)是什么?浮点计算量(FLOPs)是什么?
1.网络中的参数量(param)对应与空间Space概念,及空间复杂度。
2.浮点计算量(FLOPs)对应与时间Time概念,对应于时间复杂度。
即,网络参数量(param)和显存密切相关;浮点计算量(FLOPs)和GPU的计算速度相关。
二、如何计算网络中的参数量(param)
网络中的参数量(param)的计算
网络中参数计算需要分为
卷积层:
需要关注的参数为(kernel_size,in_channel,out_channel)
计算公式:
举个例子:
如下图所示:
image_size = 5x5x3
kernel_size = 3x3
in_channel = 3 (图像channel)
out_channel = 2 (卷积核数目\filter数目)
则该卷积层的参数个数为:
池化层:
池化层不需要参数。例如 max_pooling:直接最大化池化就可以,无需参数。
全连接层:
全连接层有两种情况,一种是卷积层到全连接层,一种是全连接层到全连接层,因此需要分情况来讨论:
CONV->FC 及计算公式
FC->FC 及计算公式
代码展示
附加:参数和模型显存\模型尺寸的关系
参数占用显存=参数数目×n
n=4:float32
n=2:float16
n=8:double64
除此之外,batch_size输入的图片占据大部分显存。
模型尺寸就是模型的大小,我们一般使用参数量parameter来衡量,注意,它的单位是个。但是由于很多模型参数量太大,所以一般取一个更方便的单位:兆(M) 来衡量。比如ResNet-152的参数量可以达到60 million = 0.0006M。有些时候,model size在实际计算时除了包含参数量以外,还包括网络架构信息和优化器信息等。比如存储一个一般的CNN模型(ImageNet训练)需要大于300MB。
M和MB的换算关系:
比如说我有一个模型参数量是1M,在一般的深度学习框架中(比如说PyTorch),一般是32位存储。32位存储的意思就是1个参数用32个bit来存储。那么这个拥有1M参数量的模型所需要的存储空间的大小即为:1M * 32 bit = 32Mb = 4MB。因为1 Byte = 8 bit。现在的quantization技术就是减少参数量所占的位数:比如我用8位存储,那么:所需要的存储空间的大小即为:1M * 8 bit = 8Mb = 1MB。