【25】模型参数量Params与计算量Flops的计算方法
文章目录
- 1. 推导公式
- 1.1 CNN Params
- 1.2 CNN Flops
- 1.3 Linear Params
- 1.4 Linear Flops
- 2. 计算方法
- 2.1 parameters法
- 2.2 thop法
- 2.3 torchstat法
- 2.4 torchsummary法
1. 推导公式
1.1 CNN Params
1.2 CNN Flops
1.3 Linear Params
1.4 Linear Flops
2. 计算方法
2.1 parameters法
通过遍历模型的parameters获取结构以及参数:
model = 你自己的模型,eg:CNN() ResNet() SegNet()....params = list(model.parameters())k = 0for i in params:l = 1print("该层的结构:" + str(list(i.size())))for j in i.size():l *= jprint("该层参数和:" + str(l))k = k + lprint("总参数数量和:" + str(k))
效果如下:
2.2 thop法
thop是一个库,可以通过pip install thop进行安装,安装后通过里面的profile可以获取参数量params以及计算量flops
from thop import profile
model = 自己的模型实例化
flops, params = profile(model, inputs=传入模型的输入shape,这个必须要填)
以resnet18进行测试:
import torch
from torchvision.models import resnet18
from thop import profile
model = resnet18()
input = torch.randn(1, 3, 128, 128)
flops, params = profile(model, inputs=(input, ))
print('flops:{}'.format(flops))
print('params:{}'.format(params))
2.3 torchstat法
还是一样,没有的先pip install torchstat即可,还是以restnet18为例:
from torchstat import stat
from torchvision.models import resnet18model = resnet18()
stat(model, (3, 224, 224))
输出:
[MAdd]: AdaptiveAvgPool2d is not supported!
[Flops]: AdaptiveAvgPool2d is not supported!
[Memory]: AdaptiveAvgPool2d is not supported!module name input shape output shape params memory(MB) MAdd Flops MemRead(B) MemWrite(B) duration[%] MemR+W(B)
0 conv1 3 224 224 64 112 112 9408.0 3.06 235,225,088.0 118,013,952.0 639744.0 3211264.0 6.25% 3851008.0
1 bn1 64 112 112 64 112 112 128.0 3.06 3,211,264.0 1,605,632.0 3211776.0 3211264.0 1.09% 6423040.0
2 relu 64 112 112 64 112 112 0.0 3.06 802,816.0 802,816.0 3211264.0 3211264.0 0.28% 6422528.0
3 maxpool 64 112 112 64 56 56 0.0 0.77 1,605,632.0 802,816.0 3211264.0 802816.0 5.61% 4014080.0
4 layer1.0.conv1 64 56 56 64 56 56 36864.0 0.77 231,010,304.0 115,605,504.0 950272.0 802816.0 4.61% 1753088.0
5 layer1.0.bn1 64 56 56 64 56 56 128.0 0.77 802,816.0 401,408.0 803328.0 802816.0 0.25% 1606144.0
6 layer1.0.relu 64 56 56 64 56 56 0.0 0.77 200,704.0 200,704.0 802816.0 802816.0 0.09% 1605632.0
7 layer1.0.conv2 64 56 56 64 56 56 36864.0 0.77 231,010,304.0 115,605,504.0 950272.0 802816.0 3.72% 1753088.0
8 layer1.0.bn2 64 56 56 64 56 56 128.0 0.77 802,816.0 401,408.0 803328.0 802816.0 0.21% 1606144.0
9 layer1.1.conv1 64 56 56 64 56 56 36864.0 0.77 231,010,304.0 115,605,504.0 950272.0 802816.0 3.63% 1753088.0
10 layer1.1.bn1 64 56 56 64 56 56 128.0 0.77 802,816.0 401,408.0 803328.0 802816.0 0.20% 1606144.0
11 layer1.1.relu 64 56 56 64 56 56 0.0 0.77 200,704.0 200,704.0 802816.0 802816.0 0.09% 1605632.0
12 layer1.1.conv2 64 56 56 64 56 56 36864.0 0.77 231,010,304.0 115,605,504.0 950272.0 802816.0 3.68% 1753088.0
13 layer1.1.bn2 64 56 56 64 56 56 128.0 0.77 802,816.0 401,408.0 803328.0 802816.0 0.20% 1606144.0
14 layer2.0.conv1 64 56 56 128 28 28 73728.0 0.38 115,505,152.0 57,802,752.0 1097728.0 401408.0 3.13% 1499136.0
15 layer2.0.bn1 128 28 28 128 28 28 256.0 0.38 401,408.0 200,704.0 402432.0 401408.0 0.19% 803840.0
16 layer2.0.relu 128 28 28 128 28 28 0.0 0.38 100,352.0 100,352.0 401408.0 401408.0 0.07% 802816.0
17 layer2.0.conv2 128 28 28 128 28 28 147456.0 0.38 231,110,656.0 115,605,504.0 991232.0 401408.0 4.24% 1392640.0
18 layer2.0.bn2 128 28 28 128 28 28 256.0 0.38 401,408.0 200,704.0 402432.0 401408.0 0.19% 803840.0
19 layer2.0.downsample.0 64 56 56 128 28 28 8192.0 0.38 12,744,704.0 6,422,528.0 835584.0 401408.0 1.59% 1236992.0
20 layer2.0.downsample.1 128 28 28 128 28 28 256.0 0.38 401,408.0 200,704.0 402432.0 401408.0 0.22% 803840.0
21 layer2.1.conv1 128 28 28 128 28 28 147456.0 0.38 231,110,656.0 115,605,504.0 991232.0 401408.0 3.54% 1392640.0
22 layer2.1.bn1 128 28 28 128 28 28 256.0 0.38 401,408.0 200,704.0 402432.0 401408.0 0.19% 803840.0
23 layer2.1.relu 128 28 28 128 28 28 0.0 0.38 100,352.0 100,352.0 401408.0 401408.0 0.07% 802816.0
24 layer2.1.conv2 128 28 28 128 28 28 147456.0 0.38 231,110,656.0 115,605,504.0 991232.0 401408.0 3.50% 1392640.0
25 layer2.1.bn2 128 28 28 128 28 28 256.0 0.38 401,408.0 200,704.0 402432.0 401408.0 0.17% 803840.0
26 layer3.0.conv1 128 28 28 256 14 14 294912.0 0.19 115,555,328.0 57,802,752.0 1581056.0 200704.0 3.33% 1781760.0
27 layer3.0.bn1 256 14 14 256 14 14 512.0 0.19 200,704.0 100,352.0 202752.0 200704.0 0.17% 403456.0
28 layer3.0.relu 256 14 14 256 14 14 0.0 0.19 50,176.0 50,176.0 200704.0 200704.0 0.08% 401408.0
29 layer3.0.conv2 256 14 14 256 14 14 589824.0 0.19 231,160,832.0 115,605,504.0 2560000.0 200704.0 5.48% 2760704.0
30 layer3.0.bn2 256 14 14 256 14 14 512.0 0.19 200,704.0 100,352.0 202752.0 200704.0 0.21% 403456.0
31 layer3.0.downsample.0 128 28 28 256 14 14 32768.0 0.19 12,794,880.0 6,422,528.0 532480.0 200704.0 1.37% 733184.0
32 layer3.0.downsample.1 256 14 14 256 14 14 512.0 0.19 200,704.0 100,352.0 202752.0 200704.0 0.17% 403456.0
33 layer3.1.conv1 256 14 14 256 14 14 589824.0 0.19 231,160,832.0 115,605,504.0 2560000.0 200704.0 4.35% 2760704.0
34 layer3.1.bn1 256 14 14 256 14 14 512.0 0.19 200,704.0 100,352.0 202752.0 200704.0 0.17% 403456.0
35 layer3.1.relu 256 14 14 256 14 14 0.0 0.19 50,176.0 50,176.0 200704.0 200704.0 0.08% 401408.0
36 layer3.1.conv2 256 14 14 256 14 14 589824.0 0.19 231,160,832.0 115,605,504.0 2560000.0 200704.0 3.91% 2760704.0
37 layer3.1.bn2 256 14 14 256 14 14 512.0 0.19 200,704.0 100,352.0 202752.0 200704.0 0.17% 403456.0
38 layer4.0.conv1 256 14 14 512 7 7 1179648.0 0.10 115,580,416.0 57,802,752.0 4919296.0 100352.0 5.84% 5019648.0
39 layer4.0.bn1 512 7 7 512 7 7 1024.0 0.10 100,352.0 50,176.0 104448.0 100352.0 0.21% 204800.0
40 layer4.0.relu 512 7 7 512 7 7 0.0 0.10 25,088.0 25,088.0 100352.0 100352.0 0.09% 200704.0
41 layer4.0.conv2 512 7 7 512 7 7 2359296.0 0.10 231,185,920.0 115,605,504.0 9537536.0 100352.0 9.87% 9637888.0
42 layer4.0.bn2 512 7 7 512 7 7 1024.0 0.10 100,352.0 50,176.0 104448.0 100352.0 0.25% 204800.0
43 layer4.0.downsample.0 256 14 14 512 7 7 131072.0 0.10 12,819,968.0 6,422,528.0 724992.0 100352.0 1.76% 825344.0
44 layer4.0.downsample.1 512 7 7 512 7 7 1024.0 0.10 100,352.0 50,176.0 104448.0 100352.0 0.18% 204800.0
45 layer4.1.conv1 512 7 7 512 7 7 2359296.0 0.10 231,185,920.0 115,605,504.0 9537536.0 100352.0 7.26% 9637888.0
46 layer4.1.bn1 512 7 7 512 7 7 1024.0 0.10 100,352.0 50,176.0 104448.0 100352.0 0.23% 204800.0
47 layer4.1.relu 512 7 7 512 7 7 0.0 0.10 25,088.0 25,088.0 100352.0 100352.0 0.08% 200704.0
48 layer4.1.conv2 512 7 7 512 7 7 2359296.0 0.10 231,185,920.0 115,605,504.0 9537536.0 100352.0 6.57% 9637888.0
49 layer4.1.bn2 512 7 7 512 7 7 1024.0 0.10 100,352.0 50,176.0 104448.0 100352.0 0.23% 204800.0
50 avgpool 512 7 7 512 1 1 0.0 0.00 0.0 0.0 0.0 0.0 0.25% 0.0
51 fc 512 1000 513000.0 0.00 1,023,000.0 512,000.0 2054048.0 4000.0 0.71% 2058048.0
total 11689512.0 25.65 3,638,757,912.0 1,821,399,040.0 2054048.0 4000.0 100.00% 101756992.0
=================================================================================================================================================================
Total params: 11,689,512
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Total memory: 25.65MB
Total MAdd: 3.64GMAdd
Total Flops: 1.82GFlops
Total MemR+W: 97.04MBProcess finished with exit code 0
弊端:shape只能是3维的
assert isinstance(input_size, (tuple, list)) and len(input_size) == 3
2.4 torchsummary法
还是一样,用pip install torchsummay进行安装,通过下方例子进行调用。
from torchsummary import summarymodel = resnet18()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
summary(model.to(device), input_size=(3, 224, 224), batch_size=8)
输出:
----------------------------------------------------------------Layer (type) Output Shape Param #
================================================================Conv2d-1 [8, 64, 112, 112] 9,408BatchNorm2d-2 [8, 64, 112, 112] 128ReLU-3 [8, 64, 112, 112] 0MaxPool2d-4 [8, 64, 56, 56] 0Conv2d-5 [8, 64, 56, 56] 36,864BatchNorm2d-6 [8, 64, 56, 56] 128ReLU-7 [8, 64, 56, 56] 0Conv2d-8 [8, 64, 56, 56] 36,864BatchNorm2d-9 [8, 64, 56, 56] 128ReLU-10 [8, 64, 56, 56] 0BasicBlock-11 [8, 64, 56, 56] 0Conv2d-12 [8, 64, 56, 56] 36,864BatchNorm2d-13 [8, 64, 56, 56] 128ReLU-14 [8, 64, 56, 56] 0Conv2d-15 [8, 64, 56, 56] 36,864BatchNorm2d-16 [8, 64, 56, 56] 128ReLU-17 [8, 64, 56, 56] 0BasicBlock-18 [8, 64, 56, 56] 0Conv2d-19 [8, 128, 28, 28] 73,728BatchNorm2d-20 [8, 128, 28, 28] 256ReLU-21 [8, 128, 28, 28] 0Conv2d-22 [8, 128, 28, 28] 147,456BatchNorm2d-23 [8, 128, 28, 28] 256Conv2d-24 [8, 128, 28, 28] 8,192BatchNorm2d-25 [8, 128, 28, 28] 256ReLU-26 [8, 128, 28, 28] 0BasicBlock-27 [8, 128, 28, 28] 0Conv2d-28 [8, 128, 28, 28] 147,456BatchNorm2d-29 [8, 128, 28, 28] 256ReLU-30 [8, 128, 28, 28] 0Conv2d-31 [8, 128, 28, 28] 147,456BatchNorm2d-32 [8, 128, 28, 28] 256ReLU-33 [8, 128, 28, 28] 0BasicBlock-34 [8, 128, 28, 28] 0Conv2d-35 [8, 256, 14, 14] 294,912BatchNorm2d-36 [8, 256, 14, 14] 512ReLU-37 [8, 256, 14, 14] 0Conv2d-38 [8, 256, 14, 14] 589,824BatchNorm2d-39 [8, 256, 14, 14] 512Conv2d-40 [8, 256, 14, 14] 32,768BatchNorm2d-41 [8, 256, 14, 14] 512ReLU-42 [8, 256, 14, 14] 0BasicBlock-43 [8, 256, 14, 14] 0Conv2d-44 [8, 256, 14, 14] 589,824BatchNorm2d-45 [8, 256, 14, 14] 512ReLU-46 [8, 256, 14, 14] 0Conv2d-47 [8, 256, 14, 14] 589,824BatchNorm2d-48 [8, 256, 14, 14] 512ReLU-49 [8, 256, 14, 14] 0BasicBlock-50 [8, 256, 14, 14] 0Conv2d-51 [8, 512, 7, 7] 1,179,648BatchNorm2d-52 [8, 512, 7, 7] 1,024ReLU-53 [8, 512, 7, 7] 0Conv2d-54 [8, 512, 7, 7] 2,359,296BatchNorm2d-55 [8, 512, 7, 7] 1,024Conv2d-56 [8, 512, 7, 7] 131,072BatchNorm2d-57 [8, 512, 7, 7] 1,024ReLU-58 [8, 512, 7, 7] 0BasicBlock-59 [8, 512, 7, 7] 0Conv2d-60 [8, 512, 7, 7] 2,359,296BatchNorm2d-61 [8, 512, 7, 7] 1,024ReLU-62 [8, 512, 7, 7] 0Conv2d-63 [8, 512, 7, 7] 2,359,296BatchNorm2d-64 [8, 512, 7, 7] 1,024ReLU-65 [8, 512, 7, 7] 0BasicBlock-66 [8, 512, 7, 7] 0
AdaptiveAvgPool2d-67 [8, 512, 1, 1] 0Linear-68 [8, 1000] 513,000
================================================================
Total params: 11,689,512
Trainable params: 11,689,512
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 4.59
Forward/backward pass size (MB): 502.34
Params size (MB): 44.59
Estimated Total Size (MB): 551.53
----------------------------------------------------------------Process finished with exit code 0
弊端:需要比较大的显存空间才能使用
综上:我觉得thop方法比较好用
参考链接:
- https://blog.csdn.net/qq_41573860/article/details/116767639
- https://www.jianshu.com/p/d4db25322435
【25】模型参数量Params与计算量Flops的计算方法相关推荐
- 【YOLOv5-6.x】模型参数量param及计算量FLOPs解析
文章目录 前言 参数量param和计算量FLOPs简介 参数量 计算量 YOLOv5计算模型参数 训练和验证输出模型参数不同的原因分析 输出模型参数结果(以YOLOv5s-coco2017为例) 参数 ...
- 神经网络的参数量(Params)和计算量(FLOPs)
定义 参数量(Params) 参数量是指模型训练中需要训练的参数总数.用来衡量模型的大小(计算空间复杂度). 计算量(FLOPs) 浮点运算次数,理解为计算量(计算时间复杂度),可以用来衡量算法的复杂 ...
- 6种方法计算神经网络参数量Params、计算量FLOPs、Macs简单代码
方法1:统计模型参数量 total = sum([param.nelement() for param in model.parameters()]) print("Number of pa ...
- 模型参数量(Params)/模型大小 Pytorch统计模型参数量
模型参数量大小可以从保存的checkpoint文件直观看出来 total_params = sum(p.numel() for p in model.parameters()) total_param ...
- 神经网络的计算量(FLOPs)、参数量(Params)、推理时间(FPS)的定义及实现方法
目录 1. 定义 2. 实现方法 2.1. 计算参数量 2.2. 计算参数量和FLOPs 2.3. 计算推理时间(FPS) 3. 数据大小对参数量和FLOPs的影响 4. 参数量和FLOPs对于硬件要 ...
- 【深度学习】深度学习中模型计算量(FLOPs)和参数量(Params)等的理解以及四种在python应用的计算方法总结
接下来要分别概述以下内容: 1 首先什么是参数量,什么是计算量 2 如何计算 参数量,如何统计 计算量 3 换算参数量,把他换算成我们常用的单位,比如:mb 4 对于各个经典网络,论述他们是计算量大还 ...
- pytorch计算模型参数量
1. 安装 thop 1.1 常规安装 pip install thop 1.2 若上述安装方式错误,可以参考以下方式: pip install thop-i http://pypi.douban.c ...
- 模型计算量(FLOPs)和参数量(Params)的理解
(1)换算 以alexnet为例: 参数量:6000万 设每个参数都是float,也就是一个参数是4字节, 总的字节数是24000万字节 24000万字节= 24000万/1024/1024=228m ...
- 【pytorch】深度学习所需算力估算:flops及模型参数量
目录 计算量的要求是在于芯片的floaps(指的是gpu的运算能力) 参数量对应显存大小选型 常见的英伟达显卡的FLOPS和显存规格 pytorch中的floaps与显存计算方法 计算量的要求是在于芯 ...
最新文章
- 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
- JDK8:使用Optional进行变量判空、集合遍历
- 文献学习(part19)--Graph Connectivity In Sparse Subspace Clustering
- ENSP配置 实例十一 综合实验
- 关于 WebRequest.RegisterPrefix
- java应用程序必须有主类_2020最新版Java基础知识面试题
- ACM时间复杂度及算法的选择分析
- xp系统支持的python版本_xp系统安装不上python
- 电信天翼网关与路由器级联
- Win10开启卓越性能模式
- ubi命令用法(linux)
- 为什么要处理自然语言? | NLP基础
- 台计算机的本地打印机 并且,三台电脑,怎么共用一台打印机?
- 英语足球foteball运动
- 手机产品设计之用户引导
- 重新认识 Java 的 System.in
- win10下docker搭建ES7集群
- 第二篇:在MVPArms项目使用了androidx和butterknife报错
- Silvaco学习笔记——Save,log
- 整理web前端架构师应会必会的技术栈
热门文章
- 来点干货,怎么面国企或银行?终于写完了
- Mysql:insert into select与 insert into values
- 设圆半径r,圆柱高h求圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。
- CentOS中如何检测IP冲突
- 飞项| 产品经理如何搭建团队协作构建体系
- CHM文件打开空白是什么原因
- vector 内存释放
- css实现3D旋转效果
- spring cloud gateway 之 动态路由改造
- 三星s9 测试性能软件,三星S9+和iPhone8+软件打开速度测试:谁才是状元郎