深度学习中计算量和参数量介绍、实现代码、例子

前言

理清FLOPSFLOPs大写S代表的是显卡的运算性能,小写s代表的是模型的运算次数!
FLOPS是处理器性能的衡量指标,是“每秒所执行的浮点运算次数”的缩写;
FLOPs是算法复杂度的衡量指标,是“浮点运算次数”的缩写,s代表的是复数;
例如:
在这里插入图片描述
红框中的FLOPS是大写,和显卡运算能力有关!
在这里插入图片描述
论文中,写的都是FLOPs,谁会没事在论文中写FLOPS!!

1 计算量和参数量

计算量指的是,我们网络运行时需要的次数,类似于时间复杂度,常见单位是FLOPs,GFLOPs,1GFlops = 1,000Flops
参数量指的是,我们网络中需要学习的参数,类似于空间复杂度,常见单位是M
显卡性能决定是否能带的动计算量,显卡显存决定是否能带的动参数量

2 统计计算量、参数量和模型内存

深度学习中,卷积层占据的计算量和参数量最大,因此给出卷积层的计算量和参数量计算公式:
参数量:

(kernel_size*kernel_size) *channel_input*channel_output

计算量:

(kernel_size*kernel_size*H*W) *channel_input*channel_output
H, W 指的是该层输入的图片大小

模型内存:

因为:一个参数大概就是一个 float4个字节,而 1kb=1024 字节
所以:模型内存 = 参数量 * 4 / 1024 /1024 = 总字节数 / 1024(换算成kb) /1024 (换算成MB)

举例:
在这里插入图片描述
AlexNet:内存计算:60000000*4/1024/1024=228>200Mb

3 源码分享

3.1 thop实现

代码:

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

net = resnet101(False)
X = torch.randn(1,3,256,256)
flops, params = profile(net, (X, ))
print('flops: ', flops, 'params: ', params)
print('flops: %.2f M, params: %.2f M' % (flops / 1000000.0, params / 1000000.0))

结果:
在这里插入图片描述

3.2 ptflops实现

代码:

import torchvision
from ptflops import get_model_complexity_info

model = resnet101(False)
flops, params = get_model_complexity_info(model, (3, 256, 256), as_strings=True, print_per_layer_stat=True)
print('flops: ', flops, 'params: ', params)

结果:
在这里插入图片描述
这里的GMac约等于GFLOPs,具体结果大家可以搜索一下,这个应该还是有一些出入的!

3.3 pytorch_model_summary实现各层参数量统计

代码:

import torch
import torchvision
from pytorch_model_summary import summary

net = resnet101(False)
X = torch.randn(1,3,256,256)
print(summary(net, X, show_input=False, show_hierarchical=False))

结果:
在这里插入图片描述

4 总结

  1. 影响网络参数量,和Batch没关,但是和输入数据的通道数和大小有关,大家可以自己试一下;
  2. 影响网络计算量,和Batch有关,当Batch>1时候,计算量是是Batch=1的Batch倍,大家自己试一下;

参考文献: https://blog.csdn.net/qq_40507857/article/details/118764782
参考文献: https://www.bilibili.com/video/BV1oR4y1X7xZ/?spm_id_from=333.999.0.0
参考文献:这个很不错


猜你喜欢

转载自blog.csdn.net/qq_44864833/article/details/128288630