深度学习——Pytorch模型统计FLOPs,MACs和Params评估参数

一、FLOPs,MACs和Params参数用处

1.1 评估模型复杂度

FLOPs(Floating point operations per second)是指每秒浮点运算次数,MACs (Multiply-Accumulate Operations)是指乘加操作的次数,Params(Parameters)是指模型的参数数量。这三个指标可以用来衡量模型的复杂度,即模型计算量的大小。

1.2 指导模型设计

在模型设计阶段,可以通过统计 FLOPs、MACs 和 Params 来评估不同模型结构的计算效率,并选择更优的结构。例如,可以通过降低模型的 FLOPs 来减少计算量,从而提高模型的推理速度。

1.3 分析模型性能

在模型训练和评估阶段,可以通过统计 FLOPs、MACs 和 Params 来分析模型的性能。例如,可以通过比较不同模型的 FLOPs 和推理速度来评估模型的性价比。

1.4 优化模型部署

在模型部署阶段,可以通过统计 FLOPs、MACs 和 Params 来选择合适的硬件平台和部署方案。例如,对于计算资源有限的设备,可以选择 FLOPs 较低的模型。

二、FLOPs与MACs 区别

FLOPs 和 MACs 都是用来衡量深度学习模型计算复杂度的指标。

FLOPs(Floating Point Operations)表示浮点运算次数,用来衡量模型计算复杂度,常用来做神经网络模型速度的间接衡量标准。FLOPs 可以用来衡量一个模型或模型内特定操作的计算成本或复杂性。

MACs(Multiply–Accumulate Operations)指乘加累积操作数,是一种更接近于实际硬件操作的概念。MACs 计算的是模型中所有乘法和加法的操作次数。

注:1个 MACs 包含一个乘法操作与一个加法操作,大约包含2个 FLOPs。因此,通常 MACs 与 FLOPs 存在一个2倍的关系。

补:
GMACs 表示每秒钟可以执行的十亿次乘加运算。

MMACs 表示每秒钟可以执行的百万次乘加运算。

GFLOPs 表示每秒十亿次的浮点运算数。

三、安装thop包和ptflops包

安装thop包,在终端使用下面命令:

pip install thop -i https://pypi.mirrors.ustc.edu.cn/simple/

安装ptflops包,在终端使用下面命令:

pip install ptflops -i https://pypi.mirrors.ustc.edu.cn/simple/

四、FLOPs和Params统计

4.1 resnet50例子

4.1.1 代码

from torchvision.models import resnet50
from thop import profile
import torch

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = resnet50()         
print(model)                            # 打印模型结构
# print(model.state_dict())             # 打印模型参数
model = model.to(device)

input = torch.randn(1, 3, 224, 224)      # (1, 3, 224, 224)分别表示输入的图片数量,图像通道处,图像高度和宽度
input = input.to(device)

## 统计flops, params
flops, params = profile(model, inputs=(input, ))

print('FLOPs = ' + str(flops/1000**3) + 'G')
print('Params = ' + str(params/1000**2) + 'M')

4.1.2 输出

运行上面代码,输出结果如下,可以看出resnet50模型的浮点运算次数为:4.13G,模型文件大小为:25.56M。

在这里插入图片描述

4.2 实例

4.2.1 测试模型问题

上面的模型是从官网上下载的,下面测试一个自己训练好的模型。

注意:测试自己的模型文件时,模型文件一定要是完整的模型(包含模型结构和模型参数),如果测试的模型只包含了参数,使用该代码会报错。关于训练模型时如何保存完整的模型方法,推荐博文:Pytorch中保存模型的两种方法

怎么测试现有模型是否是完整模型???

直接用下面代码测试:

import torch
model = torch.load('model/yolov5s.pt')
print(model) 

如果输出如下的网络结构,则说明现有模型时完整的:

在这里插入图片描述

如果输出一些数字,如下,则说明模型中只有权重参数:

在这里插入图片描述

4.2.2 代码

我自己训练的模型为单通道图像,测试代码见下:

from torchvision.models import resnet50
from thop import profile
import torch

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

model = torch.load('model/net_g_800.pth')                 
print(model)                            # 打印模型结构
# print(model.state_dict())             # 打印模型参数

model = model.to(device)

input = torch.randn(1, 1, 224, 224)   # 模型输入为单通道图像
input = input.to(device)

flops, params = profile(model, inputs=(input, ))

print('FLOPs = ' + str(flops/1000**3) + 'G')
print('Params = ' + str(params/1000**2) + 'M')

4.2.3 输出

运行上面代码,测试我自己的模型,输出见下:

在这里插入图片描述

五、MACs和Params统计

5.1 resnet50例子

5.1.1 代码

import torchvision.models as models
from ptflops import get_model_complexity_info
import torch
from torchvision.models import resnet50

with torch.cuda.device(0):
    model = resnet50()
    macs, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True, print_per_layer_stat=True, verbose=True)

print('{:<30}  {:<8}'.format('Computational complexity: ', macs))
print('{:<30}  {:<8}'.format('Number of parameters: ', params))

5.1.2 输出

运行代码,输出如下,resnet50模型的十亿次乘加运算值为4.13,模型大小为25.56M。

在这里插入图片描述

5.2 实例

下面用我自己训练好的模型测试。

5.2.1 代码

import torchvision.models as models
from ptflops import get_model_complexity_info
import torch
from torchvision.models import resnet50

with torch.cuda.device(0):
    model = torch.load('model/net_g_800.pth')
    macs, params = get_model_complexity_info(model, (1, 224, 224), as_strings=True, print_per_layer_stat=True, verbose=True)  # 输入图像为单通道图像

print('{:<30}  {:<8}'.format('Computational complexity: ', macs))
print('{:<30}  {:<8}'.format('Number of parameters: ', params))

5.2.2 输出

运行测试我自己的单通道模型,输出如下:

在这里插入图片描述

六、总结

以上就是Pytorch模型统计FLOPs,MACs和Params评估参数的方法。在加载模型时,不一定非得是完整模型才行,也可以只加载模型参数后,在脚本中构建模型结构或导入模型结构,同样可以测试。

总结不易,多多支持,谢谢!

感谢您阅读到最后!关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉研坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值