当前位置: 首页 > article >正文

深度学习常见指标——FLOPs(搭配代码食用)

文章目录

  • 1.前言
  • 2.简介
    • 2.1MACs
    • 2.2两者关系
  • 3.计算公式
    • 3.1 卷积层的FLOPs计算公式
    • 3.2 全连接层的FLOPs计算公式
    • 3.3 RELU层FLOPs计算
  • 4.库thop说明
  • 5.例子:resnet18的FLOPs

1.前言

首先明确一个概念:FLOPS和FLOPs不一样

  • FLOPS是处理器性能的衡量指标,:“每秒所执行的浮点运算次数”的缩写
  • FLOPs是算法复杂度的衡量指标,“浮点运算次数”的缩写,s代表的是复数

2.简介

FLOPs(Floating point operations)浮点运算次数

是衡量算法复杂度的指标(包括加减乘除等所有浮点运算)

2.1MACs

MACs(Multiply accumulate operations):乘法和加法运算的次数,一个乘法与加法算一个MACs

深度学习的很多情况下,尤其是卷积神经网络,通常是先进行元素乘法,然后将结果累加起来。因此,MACS可以很好地反映卷积神经网络中的计算量。

2.2两者关系

Flops=2*MACs
解释:每进行一次乘法,一般都会跟上一次加法,例如10次乘法,会伴随(10-1)次加法。
两者只相差1,因此近似看作两倍关系。

3.计算公式

3.1 卷积层的FLOPs计算公式

在这里插入图片描述

flops=2×(output_h × output_w)× (kernel_size)×in_channel×output_channel

flops=2×(62 × 62 )×(3×3) × 3 × 32=6642432
代码运行:

import torch
import torch.nn as nn
from thop import profile
if __name__ == '__main__':
    model=nn.Sequential(nn.Conv2d(3,32,kernel_size=3,stride=1,padding=0))

    # 输入数据
    inputs=torch.randn(1,3,64,64)

    macs,params=profile(model,inputs=(inputs,),verbose=True)
    flops=2*macs
    print('flops: ',flops)
    print('params: ',params)

在这里插入图片描述

3.2 全连接层的FLOPs计算公式

在这里插入图片描述
代码运行

if __name__ == '__main__':
    model=nn.Sequential(nn.Linear(256,10))

    # 输入数据
    inputs=torch.randn(1,3,256)
 
    # 使用thop计算参数量
    macs,params=profile(model,inputs=(inputs,),verbose=False)
    flops=2*macs
    print('flops: ',flops)
    print('params: ',params)

结果如下:

15360=2×3×256×10

3.3 RELU层FLOPs计算

  • 在计算 FLOPs 时,通常只考虑实际的浮点运算,如乘法和加法,因此 ReLU 的 FLOPs 通常被视为 0。
  • 因为这些操作(例如判断一个数是否大于零)并不涉及浮点运算。ReLU 中的比较操作通常不计)FLOPS.

4.库thop说明

thop 是一个用于计算PyTorch模型FLOPs(每秒浮点运算次数)和参数数量的Python库。它可以帮助开发者理解和优化深度学习模型的计算复杂度,对于模型的性能分析、优化以及资源需求评估等方面非常有用。


参数说明:

  • model:传入的模型
  • inputs:输入(格式一般是元组)
  • verbose:是否输出日志信息(True输出,False不输出)

返回数据:

  • MACs
  • FLOPs
  • Params:参数所占空间大小

5.例子:resnet18的FLOPs

import torch
from torchvision import models
import thop
if __name__ == '__main__':
    #resnet18
    model=models.resnet18(weights=None)
    #输入数据
    inputs=torch.randn(1,3,224,224)
    #计算
    MACs,Params=thop.profile(model,inputs=(inputs,),verbose=True)
    FLOPs=MACs*2
    MACs,FLOPs,Params=thop.clever_format([MACs,FLOPs,Params],'%.3f')

    print(f'MACs:{MACs}')
    print(f'FLOPs:{FLOPs}')
    print(f'Params:{Params}')
    print(model)

在这里插入图片描述


http://www.kler.cn/a/422207.html

相关文章:

  • MySQL的连接类型
  • SpringMVC中的Handler、HandlerMapping、HandlerAdapter
  • 【青牛科技】D7413 高度集成的功率/电能监控模拟前端(AFE) IC,用于测量电能计量应用
  • 【Docker系列】Docker 中使用 Redis 配置文件的详细指南
  • FcaNet: Frequency Channel Attention Networks论文解读
  • CentOS7 虚拟机 双网卡绑定
  • 爬虫第四篇:Xpath 路径表达式全解析:从网页基础到爬取百度贴吧图片实战
  • protobuf使用说明
  • html+css网页设计马林旅行社移动端4个页面
  • Python Web 开发 FastAPI 入门:从基础架构到框架比较
  • Go 语言函数编程指南:定义、调用技巧与返回值机制
  • 40分钟学 Go 语言高并发:基准测试编写
  • 项目开发规范
  • 论文:IoU Loss for 2D/3D Object Detection
  • 明明的随机数
  • FPGA实战篇(触摸按键控制LED灯)
  • Mock.js的学习使用
  • 5G学习笔记之随机接入
  • 基于Java Springboot校园导航微信小程序
  • 658.找到K个最接近的元素(双指针)