目录
一、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评估参数的方法。在加载模型时,不一定非得是完整模型才行,也可以只加载模型参数后,在脚本中构建模型结构或导入模型结构,同样可以测试。
总结不易,多多支持,谢谢!
感谢您阅读到最后!关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!