深度学习中有关网络中的参数量(param)计算。附录有浮点计算量(FLOPs)的链接。

article/2025/11/2 11:00:30

文章目录

  • 网络中的参数量(param)和浮点计算量(FLOPs)的计算
  • 一、网络中的参数量(param)是什么?浮点计算量(FLOPs)是什么?
  • 二、如何计算网络中的参数量(param)
    • 网络中的参数量(param)的计算
    • 卷积层:
      • 计算公式:
    • 池化层:
    • 全连接层:
      • CONV->FC 及计算公式
      • FC->FC 及计算公式
    • 代码展示
  • 附加:参数和模型显存\模型尺寸的关系
  • 总结及浮点计算量FLOPs的指引

网络中的参数量(param)和浮点计算量(FLOPs)的计算

可以在我都模板仓库的Utils文件夹中查看具体有关参数量(param)和浮点计算量(FLOPs)的计算代码。

一、网络中的参数量(param)是什么?浮点计算量(FLOPs)是什么?

  1. 网络中的参数量(param)对应与空间Space概念,及空间复杂度。
  2. 浮点计算量(FLOPs)对应与时间Time概念,对应于时间复杂度。

即,网络参数量(param)和显存密切相关;浮点计算量(FLOPs)和GPU的计算速度相关。

二、如何计算网络中的参数量(param)

网络中的参数量(param)的计算

网络中参数计算需要分为

卷积层:

需要关注的参数为(kernel_size,in_channel,out_channel)

计算公式:

完全版 c o n v _ p a r a m = ( k e r n e l _ s i z e ∗ i n _ c h a n n e l + b i a s ) ∗ o u t _ c h a n n e l conv\_param = (kernel\_size*in\_channel+bias)*out\_channel conv_param=(kernel_sizein_channel+bias)out_channel,默认 b i a s = 1 bias=1 bias=1,out_channel是filter(代表卷积核个数),且每个卷积核都有对应的bias。

简略版 c o n v _ p a r a m = k e r n e l _ s i z e ∗ i n _ c h a n n e l ∗ o u t _ c h a n n e l conv\_param = kernel\_size*in\_channel*out\_channel conv_param=kernel_sizein_channelout_channel,因为bias不会影响数量级的变化,一般可省略。

举个例子
如下图所示:
image_size = 5x5x3
kernel_size = 3x3
in_channel = 3 (图像channel)
out_channel = 2 (卷积核数目\filter数目)
则该卷积层的参数个数为:
完全版: c o n v _ p a r a m = ( k e r n e l _ s i z e ∗ i n _ c h a n n e l + b i a s ) ∗ o u t _ c h a n n e l = = ( 3 ∗ 3 ∗ 3 + 1 ) ∗ 2 = 56 conv\_param = (kernel\_size*in\_channel+bias)*out\_channel==(3*3*3+1)*2 = 56 conv_param=(kernel_sizein_channel+bias)out_channel==(333+1)2=56
简略版: c o n v _ p a r a m = k e r n e l _ s i z e ∗ i n _ c h a n n e l ∗ o u t _ c h a n n e l = 3 ∗ 3 ∗ 3 ∗ 2 = 54 conv\_param = kernel\_size*in\_channel*out\_channel =3*3*3*2 = 54 conv_param=kernel_sizein_channelout_channel=3332=54
1

池化层:

池化层不需要参数。例如 max_pooling:直接最大化池化就可以,无需参数。

全连接层:

全连接层有两种情况,一种是卷积层到全连接层,一种是全连接层到全连接层,因此需要分情况来讨论:

CONV->FC 及计算公式

C o n v _ F C _ p a r a m = f e t u r e m a p _ s i z e ∗ i n _ c h a n n e l ∗ o u t _ n e u r a l Conv\_FC\_param = feturemap\_size*in\_channel*out\_neural Conv_FC_param=feturemap_sizein_channelout_neural
feturemap_size : 前一层特征图尺寸
in_channel : 前一层卷积核个数
out_neural : 全连接层神经元个数

FC->FC 及计算公式

F C _ F C _ p a r a m = i n _ n e u r a ∗ ∗ o u t _ n e u r a l − b i a s FC\_FC\_param = in\_neura**out\_neural-bias FC_FC_param=in_neuraout_neuralbias
bias = out_neural,每个神经元都有一个bias。一般可忽略bias。

代码展示

Pytorch中计算网络中的参数量的包有很多,例如torchstat、thop、ptflops、torchsummary等等,这里将选取部分进行展示。

  1. 首先搭建一个简单的CNN网络:
import torch 
from torch import nn
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Sequential(         # input shape (1, 28, 28)nn.Conv2d(in_channels=1,              # input height  gray just have one levelout_channels=16,            # n_filterskernel_size=5,              # filter sizestride=1,                   # filter movement/steppadding=2 ),                          # output shape (16, 28, 28)                                   nn.ReLU(),                      # activationnn.MaxPool2d(kernel_size=2),    # choose max value in 2x2 area, output shape (16, 14, 14))self.conv2 = nn.Sequential(        # input shape (16, 14, 14)nn.Conv2d(16, 32, 5, 1, 2),     # output shape (32, 14, 14)nn.ReLU(),                      # activationnn.MaxPool2d(2),                # output shape (32, 7, 7))self.out = nn.Linear(32 * 7 * 7, 10)   # fully connected layer, output 10 classesdef forward(self, x):x = self.conv1(x)x = self.conv2(x)x = x.view(x.size(0), -1)           # flatten the output of conv2 to (batch_size, 32 * 7 * 7)output = self.out(x)return output, x    # return x for visualizationcnn = CNN()
print(cnn)  # net architecture
  1. 计算参数量

Torchstat包的使用

from torchstat import stat# 导入模型,输入一张输入图片的尺寸
stat(cnn, (1, 28, 28))

输出结果:

      module name  input shape output shape   params memory(MB)         MAdd        Flops  MemRead(B)  MemWrite(B) duration[%]  MemR+W(B)
0         conv1.0    1  28  28   16  28  28    416.0       0.05    627,200.0    326,144.0      4800.0      50176.0      46.17%    54976.0
1         conv1.1   16  28  28   16  28  28      0.0       0.05     12,544.0     12,544.0     50176.0      50176.0       0.22%   100352.0
2         conv1.2   16  28  28   16  14  14      0.0       0.01      9,408.0     12,544.0     50176.0      12544.0      12.20%    62720.0
3         conv2.0   16  14  14   32  14  14  12832.0       0.02  5,017,600.0  2,515,072.0     63872.0      25088.0      35.98%    88960.0
4         conv2.1   32  14  14   32  14  14      0.0       0.02      6,272.0      6,272.0     25088.0      25088.0       0.05%    50176.0
5         conv2.2   32  14  14   32   7   7      0.0       0.01      4,704.0      6,272.0     25088.0       6272.0       5.03%    31360.0
6             out         1568           10  15690.0       0.00     31,350.0     15,680.0     69032.0         40.0       0.35%    69072.0
total                                        28938.0       0.16  5,709,078.0  2,894,528.0     69032.0         40.0     100.00%   457616.0
=========================================================================================================================================
Total params: 28,938
-----------------------------------------------------------------------------------------------------------------------------------------
Total memory: 0.16MB
Total MAdd: 5.71MMAdd
Total Flops: 2.89MFlops
Total MemR+W: 446.89KB

Torchinfo包的使用: (刚刚写完,发现torchsummary 更名为 torchinfo了,用这个)
pip install torchinfo

#from torchsummary import summary
from torchinfo import summary# 导入模型,输入一张输入图片的尺寸
#summary(cnn.cuda(), input_size=(1, 28, 28), batch_size=-1)
batch_size = 1
summary(model, input_size=(batch_size, 1, 28, 28))

输出结果:

----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Conv2d-1           [-1, 16, 28, 28]             416ReLU-2           [-1, 16, 28, 28]               0MaxPool2d-3           [-1, 16, 14, 14]               0Conv2d-4           [-1, 32, 14, 14]          12,832ReLU-5           [-1, 32, 14, 14]               0MaxPool2d-6             [-1, 32, 7, 7]               0Linear-7                   [-1, 10]          15,690
================================================================
Total params: 28,938
Trainable params: 28,938
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.32
Params size (MB): 0.11
Estimated Total Size (MB): 0.44
----------------------------------------------------------------

两种包的显示结果各有优劣,可以依据需求来使用。

Thop包的使用及Pytorch自带参数计算的使用:

from thop import profile
model = build_detection_model(cfg).cuda()# 导入模型,输入一张输入图片的尺寸
print(model)
input = torch.randn(1, 3, 300, 300).cuda()
flop, para = profile(model, inputs=(input, ))
print('Flops:',"%.2fM" % (flop/1e6), 'Params:',"%.2fM" % (para/1e6))
total = sum([param.nelement() for param in model.parameters()])
print('Number of parameter: %.2fM' % (total/1e6))

附加:参数和模型显存\模型尺寸的关系

参数占用显存=参数数目×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。

总结及浮点计算量FLOPs的指引

浮点计算量:
FLOPs如何计算

参考:
https://blog.csdn.net/m0_51004308/article/details/118048504
https://blog.csdn.net/weixin_45292794/article/details/108227437
https://blog.csdn.net/Leo_whj/article/details/109636819


http://chatgpt.dhexx.cn/article/J800oJIj.shtml

相关文章

【详解】@Param注解的用法

1、概述 首先明确这个注解是为SQL语句中参数赋值而服务的。 Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(Param("userId") int id),也就是说外部想要取…

关于STM32例程中U8,U16,U32的问题

在看STM32例程的时候,发现对u8, u16,u32存在疑问。 使用go to definition时发现无法找到 然后项目管理栏上,发现stdio.h,stdint.h出现了感叹号警示 解决方式,打开微库 使用go to definition,还是没有,于是…

C语言用printf()打印u8,u16,u32等参数类型

想必大家都知道printf打印int 型是用%d,但是u8,u16,u32,u64还有s8,s16,s32,s64是如何打印呢,知道的大佬绕行哈,不知道往下看看。 what is u8? 常见的u8其实是自定义的,定义如下: typedef signed char s8; typedef unsigned …

LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)

阴码逐列 式顺向C51 格式 void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) { u8 temp,t1,t;u16 y0y;u8 csize(size/8((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数 numnum- ;//得到偏移后的值(ASCII字库是从空格开始取…

【☠️️社死现场の老板来了☠️️】小伙,搞C语言嵌入式开发这么久了,还不知道u8、u16、u32、s8、s16、s32是什么意思啊?

老板来了: 糖糖小伙,你搞C语言嵌入式开发这么久了,我来考考你u8、u16、u32、s8、s16、s32是什么意思啊?你要是回答的让我满意了,给你升职加薪,从此走上人生巅峰呦~ 报告老板: 作为C语言后入式…

C语言中vu16什么意思,15.stm32 数据类型的定义(常用的U8,U16,U32到底代表什么)

满意答案 月冰p莹月 2020.09.14 采纳率:48% 等级:12 已帮助:9104人 去百度文库,查看完整内容> 内容来自用户:尘客i 在KeilMDK开发环境里,比如一个无符号32位整形数据会有很多种表示方法: 1&#xff0…

C语言中u8 u16 u32含义,有关stm32的问题,程序里面的u8、u16这些是什么意思啊

u8是unsigned char,u16是unsigned short,u32是unsigned long。 u8,u16,u32都是C语言数据类型,分别代表8位,16位,32位长度的数据类型,一个字节是8位,所以u8是1个字节&…

C语言中u8 u16 u32含义,有关stm32的问题,程序里面的u8、u16的含义

u8是unsigned char,u16是unsigned short,u32是unsigned long。 ; u8,u16,u32都是C语言数据类型,分别代表8位,16位,32位长度的数据类型,一个字节是8位,所以u8是1个字节&…

u32在c语言中的作用,c语言中u8,u16,u32(示例代码)

u8是unsigned char,u16是unsigned short,u32是unsigned long。 u8,u16,u32都是C语言数据类型,分别代表8位,16位,32位长度的数据类型,一个字节是8位,所以u8是1个字节&…

《C语言程序设计》实训报告

任务一顺序结构程序设计 1.编写已知半径r为15求圆面积的程序 文字&#xff1a; 1.定义一个变量r15&#xff1b; 2.让3.14与r*r相乘得的积为s&#xff1b; 3.输出s的值&#xff1b; 流程图&#xff1a; 代码&#xff1a; #include <stdio.h> int main() { double…

单片机c语言程序设计实训100例基于pic pdf,单片机C语言程序设计实训100例 基于AVR+Proteus仿真.pdf...

作 者 &#xff1a;彭伟编著 出版发行 : 北京&#xff1a;北京航空航天大学出版社 , 2010.05 ISBN号 &#xff1a;978-7-5124-0068-9 页 数 &#xff1a; 568 原书定价 : 65.00 主题词 : 单片微型计算机-C语言-程序设计 中图法分类号 : TP3 ( 工业技术->自动化技术、计算机技…

8051单片机的C语言程序设计

一、数据类型 &#xff08;一&#xff09;基本类型&#xff1a; 1. 位类型&#xff08;bit&#xff09;:1&#xff09;是C51的扩充数据类型&#xff0c;用于访问8051中可寻址的位单元。 2&#xff09;8051支持两种位类型&#xff1a;bit型和sbit类型&#xff0c;它们在内存中都…

c语言程序设计实训

任务一、顺序结构程序设计 1.编写已知半径r为15的圆面积 #include <stdio.h> int main() {double r, s, pi 3.14159;printf("请输入圆的半径为&#xff1a;");scanf_s("%lf", &r);s pi * r * r;printf("面积为&#xff1a;%f", s)…

51单片机基础实验例程

代码来源见代码注释。 Table of Contents 实验1&#xff1a;点亮第一个LED 实验2&#xff1a;LED闪烁 实验3&#xff1a;LED流水灯 实验4&#xff1a;蜂鸣器 实验5&#xff1a;静态数码管显示 实验6&#xff1a;动态数码管显示 实验7&#xff1a;独立按键 实验8&#x…

单片机c语言应用100例第3版课后答案,单片机C语言应用100例(第3版)

读者对象&#xff1a; 本书在编写时力求通俗、易懂&#xff0c;硬件原理以"有用、够用”为原则&#xff0c;内容讲解以"紧密结合实践”为特色。因此&#xff0c;本书特别适合单片机零起点的初学者使用&#xff0c;可作为高等院校控制类专业学生、电子爱好者及各类工程…

51单片机C语言程序100例分析(1)IO+C语言+头文件

51单片机C语言程序100例分析&#xff08;1&#xff09;IOC语言头文件 \\\插播一条&#xff1a;文章末尾有惊喜哟~/// P10xfe;//P111111110B&#xff0c;即P1.0输出低电平} 分析&#xff1a;通过这短短的几行代码就能够让51单片机的P1.0引脚输出低电平&#xff0c;首先#includ…

单片机c语言赚钱,单片机C语言程序设计实训100例(从初级入手).pdf

您所在位置&#xff1a;网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp嵌入式开发 单片机C语言程序设计实训100例(从初级入手).pdf59页 本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。 下载提示 1.本站不保证该用户上传的…

51单片机C语言编程100例pdf,51单片机C语言编程100例.doc

51单片机C语言编程100例.doc .目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0、P2、P3口认识I/O口的引脚功能3实例6使用P3口流水点亮8位LED3实例7通过对P3口地址的操作流水点亮8位LED3实例8用不同数据类型控制…

单片机c语言程序设计实训报告,(整理)单片机C语言程序设计实训100例.doc

(整理)单片机C语言程序设计实训100例.doc .单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的时间间隔闪烁*/includereg51.hdefine uchar unsigned chardefine uint unsigned intsbit LEDP10;延时void Del…

单片机C语言程序设计实训100例基于8051+Proteus仿真

初学单片机的时候&#xff0c;需要一些比较基础的例子来参考和提高自己 &#xff0c;这里整理一下常用的基本例子&#xff0c;给有需要的人也下载哦 内如下&#xff1a; 分2个文件夹基础部分和硬件应用部分 比如基础里面第一个 闪烁LED程序&#xff0c;C文件如下 #include &…