CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的

看到有人对flops有疑惑,先捋清这个概念。

FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。

FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。

网上打字很容易全小写,造成混淆,本问题针对模型,应指的是FLOPs

each MAC contains one multiplication and one addition.

————————————————————————————————————————

描述一个深度学习框架/模型,除了它的精度,通常用Forward Pass计算量和参数个数(#Parameters)来描述复杂度

前者描述了所需的计算力

后者描述了所需的内存

1、深度学习框架FLOPs的概念(即:浮点运算数量;也可以用MAC表示:each MAC contains one multiplication and one addition.)https://github.com/sovrasov/flops-counter.pytorch/issues/16

paper里比较流行的单位是GFLOPs:1 GFLOPs = 10^{9} FLOPs (即:10亿次浮点计算)

2、深度学习框架FLOPs的组成

1、卷积运算Conv

用以下动图中直观的解释:

image大小:5*5

卷积核大小:3*3

举例:一次3*3的卷积(求右图矩阵的一个元素的值)所需的运算量:(3*3)个乘法+(3*3-1)各加法 =17

得到3*3大小的特征图尺寸:17*9 = 153

1)bn

2)linear

3)上采样

4)poolings

5)relu

Conv占的比重最大,此外他和输入图像的大小也有关系

而#Parameters和图像大小没有关系

3、计算Forward Pass计算量和参数个数(#Parameters)的代码(基于pytorch)

https://github.com/Lyken17/pytorch-OpCounter

https://github.com/sovrasov/flops-counter.pytorch

4、常用框架的复杂度

### Faster R-CNN 参数 FLOPs计算 为了计算 Faster R-CNN 模型参数 FLOPs,可以利用 PyTorch 提供的相关工具以及第三方库 `torchstat` 或者 `thop` 来完成这一任务。以下是具体的代码实现: #### 使用 torchstat 计算 Faster R-CNN参数 FLOPs `torchstat` 是一种专门用于统计神经网络模型参数量、FLOPs 其他指标的工具[^2]。可以通过安装该库并调用其功能来获取所需数据。 ```bash pip install torchstat ``` 下面是基于 Faster R-CNN 的具体代码示例: ```python import torchvision.models as models from torchstat import stat # 加载预定义的 Faster R-CNN 模型 (以 ResNet-50 backbone 为例) model = models.detection.fasterrcnn_resnet50_fpn(pretrained=True) # 输入张量尺寸设置为 CxHxW 形式, 假设输入图片大小为 3x640x640 input_size = (3, 640, 640) # 调用 stat 函数分析模型 stat(model, input_size) ``` 上述代码会输出模型的总参数数量Parameters)、每秒浮点运次数(FLOPs)以及其他相关信息。 --- #### 使用 thop 库手动计算 FLOPs 参数量 另一种方法是通过 `thop` 工具包来进行更灵活的操作。此方式允许开发者自定义哪些部分参与计算,并支持逐层查看资源消耗情况。 ```bash pip install thop ``` 下面是一个完整的代码片段展示如何使用 `thop` 对 Faster R-CNN 进行评估: ```python import torch from thop import profile from torchvision.models.detection import fasterrcnn_resnet50_fpn # 初始化 Faster R-CNN 模型实例 device = 'cuda' if torch.cuda.is_available() else 'cpu' faster_rcnn_model = fasterrcnn_resnet50_fpn(pretrained=True).to(device) # 定义随机输入样本作为测试依据 dummy_input = torch.randn(1, 3, 640, 640, device=device) # 执行 profile 方法得到 MACs 及 Parameters 数值 macs, params = profile(faster_rcnn_model, inputs=(dummy_input,)) print(f"FLOPs: {macs * 2}") # 将乘法与加法视为一次操作故需乘二 print(f"Number of parameters: {params}") ``` 这里需要注意的是,由于某些特殊模块可能无法被完全解析,因此实际运行时可能会遇到一些警告提示;不过总体来说不会影响最终结果的有效性。 --- ### 关于 Faster R-CNN 结构特点及其优化建议 Faster R-CNN 整合了多个子组件,包括但不限于特征提取器(Feature Extractor)、区域提议网络(RPN)、边界框回归器(Bounding Box Regressor)以及分类器(Classifier)。这种端到端的设计显著提升了目标检测效率[^3]。然而,在处理小物体或者复杂场景下仍可能存在不足之处。针对这些问题可考虑引入额外机制比如 Feature Pyramid Network(FPN)[^5]进一步增强表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值