计算模型的FLOPs

2023-05-16

为了探究影响模型运行时间的变量,之前运用了参数量做标准

参数量在TF框架下还是很容易计算的

TF框架下运用

tf.keras.models.Model().summary()

就能一键生成包含模型的layers,output,parameters的报告

在这里插入图片描述

为了探究其他标准用于反映模型的运行时间,我们在网上找到了三个标准:

参数量(parameters)
浮点运算次数(FLOPs)
内存访问次数(MAC)

这次我们就来探究FLOPs对模型latency的影响

一上来先踩坑

TF2.X取消了Profiler接口对于FLOPs的统计

即使通过网上给的TF1.X接口再用TF2.X compat.v1接口依然不能成功返回FLOPs的值

于是只能写个程序硬算

FLOPs本质上是模型中的乘法和加法运算,

模型里面的layers有:

Input layer

Zero Padding layer

Conv2D

BatchNormalization

Activation

Depthwise conv2D

Dense

其中因为浮点运算次数很少而可以忽略不记的layers:

Input,

zero padding,

BatchNormalization,

Activation

剩下需要计算的layers就是:

Conv2D,

Depthwise Conv2D,

Dense

Conv2D:

F L O P s = C i n ∗ K ∗ K ∗ H ∗ W ∗ C o u t FLOPs=Cin*K*K*H*W*Cout FLOPs=CinKKHWCout

Cin是输入的channel

K*K是kernel size

H*W是输出size

Cout是输出channel

Depthwise Conv2D:

F L O P s = C i n ∗ H ∗ W ∗ K ∗ K / S / S FLOPs=Cin*H*W*K*K/S/S FLOPs=CinHWKK/S/S

Cin是输入的channel

K*K是kernel size

H*W是输入size

S*S是strides

Dense:

F L O P s = 2 ∗ C i n ∗ C o u t FLOPs=2*Cin*Cout FLOPs=2CinCout

Cin是输入的channel

Cout是输出channel

基本层定义好了之后就按照模型的结构将运算FLOPs的结构搭起来

在这里插入图片描述

每一层输出的数据跟模型的也是一样的

#for conv2D layers in Depthwise Res Block
#padding=same stride=(1,1)
#request input:
# channel out(filter),
# kernel size(k[2]),
# input(cin[3])
#
#output:
# Flops of this layer(conv2dDRB_FLPOs)
# output(cout[3])
def conv2DDRB(filter,kernel,cin):
    H=cin[0]
    W=cin[1]
    conv2dDRB_FLOPs=cin[2]*kernel[0]*kernel[1]*filter*H*W
    cout=[H,W,filter]
    return conv2dDRB_FLOPs,cout

#for DepthwiseConv2D layers in Depthwise Res Block
#request input:
# kernel size(kernal[2]),
# stride(stride[2]),
# input(cin[3])
#output:
# FLOPs of this layer(DepConv2dDRB_FLOPs)
# output(out[3])
def DepthwiseConv2DDRB(kernel,stride,cin):
    out=[0,0,0]
    if stride[0]==1 :
        DepConv2dDRB_FLOPs=cin[0]*cin[1]*cin[2]*kernel[0]*kernel[1]
        out=cin
    else:
        DepConv2dDRB_FLOPs=cin[0]*cin[1]*cin[2]*kernel[0]*kernel[1]/stride[0]/stride[1]
        out[0]=cin[0]/stride[0]
        out[1]=cin[1]/stride[1]
        out[2]=cin[2]

    return DepConv2dDRB_FLOPs, out

def DRB(cin, filter,kernel,stride,t):
    exp_channel=cin[2]*t
    alpha=filter
    block_counter=0
 conv_flop,cout=conv2DDRB(exp_channel,(1,1),cin)
    block_counter+=conv_flop
    dep_flop,cout=DepthwiseConv2DDRB(kernel,stride,cout)
    block_counter+=dep_flop
    conv_flop,cout=conv2DDRB(alpha,(1,1),cout)
    block_counter+=conv_flop
    print('This Block FLOPs:',block_counter,'Output:',cout)
    return block_counter,cout


def conv(filter,kernel,stride,cin):
    H=cin[0]/stride[0]
    W=cin[1]/stride[1]
    conv_FLOPs=cin[2]*kernel[0]*kernel[1]*filter*H*W
    cout=[H,W,filter]
    return conv_FLOPs, cout

def GolbalAvgPool(cin):
    features=cin[2]
    print('Output:',features)
    return features

def den(classes,fin):
    flop=2*fin*classes
    print('This layer FLOPs:',flop,'Output:',classes)
    return flop, classes
def MNV2(classes):
    total_count=0
 img_input=(224,224,3)
    conv_flop,cout=conv(32,(3,3),(2,2),img_input)
    total_count+=conv_flop
    print('This layer FLOPs:',conv_flop,'Output:',cout)
    Dep_flop,cout=DepthwiseConv2DDRB((3,3),(1,1),cout)
    total_count+=Dep_flop
    print('This layer FLOPs:', Dep_flop, 'Output:', cout)
    conv_flop,cout=conv(16,(1,1),(1,1),cout)
    total_count += conv_flop
    print('This layer FLOPs:', conv_flop, 'Output:', cout)
    DRB_flops,cout=DRB(cout,24,(3,3),(2,2),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,24,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,32,(3,3),(2,2),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,32,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,32,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,64,(3,3),(2,2),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,64,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,64,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,64,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,96,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,96,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,96,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,160,(3,3),(2,2),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,160,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,160,(3,3),(1,1),6)
    total_count+=DRB_flops
    DRB_flops,cout=DRB(cout,320,(3,3),(1,1),6)
    total_count+=DRB_flops
    conv_flop,cout=conv(1280,(1,1),(1,1),cout)
    total_count+=conv_flop
    cout=GolbalAvgPool(cout)
    Den_flops,classes=den(classes,cout)
    total_count+=Den_flops
    print('TOTAL FLOPs:',total_count,'Output:',classes)
    return total_count,classes


def main():

    MNV2(5)

if __name__=='__main__':
    main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算模型的FLOPs 的相关文章

  • 深度学习环境安装(VMware)-Miniconda-pytorch

    提示 xff1a 最近要要跑一些算法 xff0c 用的linux系统一直是在服务器上进行开发 xff08 无GUI界面 xff09 xff0c 双系统又懒得开关机 xff0c 虚拟机还不能调用gpu xff0c 真无了个大语 对于文章中出现
  • novnc安装

    ubuntu22 04 span class token comment 安装软件 span span class token function sudo span span class token function apt span sp
  • python扫描端口

    什么是端口扫描 定义 xff1a 对一段端口或指定的端口进行扫描 目的 xff1a 通过扫描结果可以知道一台计算机上都提供了哪些服务 xff0c 然后就可以通过所提供的这些服务的己知漏洞就可进行攻击 原理 xff1a 当一个主机向远端一个服
  • HTML_移动端界面

    homework8 移动端界面 注 点击图标放大 点击图片旋转180度 ydd html span class token doctype lt DOCTYPE html gt span span class token tag span
  • Windows11安装与使用初体验

    Windows11安装 因为下载的是美国镜像 xff0c 所以系统语言是英文的 xff0c 但是这么多年的使用 xff0c 还是能够看懂一二的 xff0c 一步步操作就好了呗 xff0c 随缘点击 xff0c 无脑下一步 不知是我没有选择对
  • 基于51单片机的智能窗帘仿真方案原理图设计

    系统总体方案 xff08 附文件 xff09 通过上述对各个模块介绍 xff0c 我们最终选择了采用STC89C52作为的主控芯片 xff0c 采用光敏电阻采集环境光强通过ADC0832转换成数字信息然后由单片机处理得出环境光强的情况 xf

随机推荐

  • 基于RNN-LSTM模型的诗词生成/TensorFlow

    1 研究任务一介绍 1 1 研究任务 给定诗词数据集poems xff0c 采用基于循环神经网络 xff08 RNN xff09 的LSTM模型实现古诗词自动生成 xff0c 调整参数实现五言诗 七言诗 五言藏头诗 七言藏头诗和词的自动生成
  • PX4飞控学习与开发(三)-PX4+ROS开发环境搭建

    PX4开发环境搭建 主要步骤如下 xff1a 第一步 xff0c 设置用户组 在终端输入命令 xff1a sudo usermod a G dialout USER xff0c 然后登出 xff0c 重启 xff1b 第二步 xff0c P
  • PX4飞控学习与开发(五)-Pixhawk固件Firmware源码结构分析

    Pixhawk固件Firmware源码结构分析 Pixhawk源码Firmware是一个内容庞大的文件夹 xff0c 里面有许多的子文夹 xff0c 代表着不同的功能模块 文件夹结构如下图所示 xff1a 图1 Firmware源码结构 图
  • Latex的一些排版技巧

    Latex是科研论文写作的必备工具之一 xff0c 学会一些常用的排版指令有助于快速提高论文的排版质量 本篇博客的主要内容就是总结一些排版技巧 xff0c 方便后续查找使用 当然 xff0c 随着latex排版相关知识的进一步学习和使用 x
  • PX4飞控学习与开发(六)-利用 VScode 修改源码

    努力学习 xff0c 珍惜时间 xff1b 全力以赴 xff0c 创造未来 克制欲望 xff0c 摒除心魔 xff1b 心向何处 xff0c 往来圣贤 功崇惟志 xff0c 业广惟勤 xff1b 惟克果断 xff0c 乃罔后艰 面临困难 x
  • 基于VSCode软件的markdown笔记环境配置

    前期在CSDN上用markdown写了一些博客 xff0c 使用时还是觉得不太方便 xff0c 尤其是在编写公式时 xff0c 效率十分低下 但Markdown本身还是一款非常不错的笔记撰写工具 xff0c 所以一直琢磨着怎么改善其使用体验
  • Ubuntu 主机单系统 安装

    首先是安装系统 xff0c 启动盘是USB HDD模式 xff0c 其他基本和下面这篇文章一样 xff0c 除了安装时候没有Install 然后按e什么的 xff0c 应该是因为我的是20 04吧 史上最全Ubuntu18 04单系统安装教
  • 竞拍算法(Auction Algorithm)原理及工作过程分析

    这几天因一些项目工作 xff0c 需要对竞拍算法进行学习 但百度了大部分资料都未找到一篇文章对此算法有着较为深入的介绍 在一番努力之下 xff0c 终于找到了最初提出该算法的论文 xff0c 本文内容主要结合该论文对竞拍算法进行分析 竞拍算
  • PX4飞控学习与开发(七)-Pixhawk源码中的功能模块分析

    本篇博客主要介绍Firmware固件中各功能模块的基本结构 功能模块的编译 从上篇博客内容中的demo我们可以发现 xff0c 如果我们需要给Pixhawk模块新增一个功能模块 xff0c 一般的做法是新建一个文件夹 xff0c 所有这个功
  • XBee模块实现QGC与PX4飞控的组网通信连接

    本篇博客介绍如何利用XBee模块实现QGC地面站与飞控的通信 一 问题的提出 正如 上一篇博客 指出 xff0c PX4飞控原装数传模块 xff08 3DR Radio xff09 只能一对一通信 xff0c 并不能实现多机组网通信 xff
  • 基于PX4飞控的双机领航-跟踪的理论分析与实验验证

    双机领航 跟踪是最简单的无人机分布式控制 xff0c 是实现大规模集群分布式控制的基础 xff0c 本文主要记录对如何实现双机跟踪护航控制的思考以及验证实验 文章目录 一 理论基础二 仿真实验三 实飞实验 一 理论基础 无人机的位置控制模型
  • MATLAB常用命令及操作

    目录 0 MATLAB注释转到Ubuntu下乱码问题1 矩阵的相关操作2 取整函数3 MATLAB排序4 矩阵构造5 各种线条颜色及形状标记 0 MATLAB注释转到Ubuntu下乱码问题 将文件夹下所有m文件转为UTF 8 xff1a e
  • ubuntu里的QGC编译生成的文件到第二台电脑里运行

    QGC编译生成的文件如下 xff1a 将整个debug文件夹复制过去 xff0c 然后执行以下步骤 xff1a sudo chmod 43 x qgroundcontrol start sh 赋予权限 qgroundcontrol star
  • 2021 SLAM会议论文汇总

    目录 1 ICRA2021语义定位与建图视觉SLAM视觉里程计视觉三维重建视觉惯性里程计跟踪深度估计视觉定位激光雷达定位多传感器数据融合多传感器融合建图激光雷达SLAM激光雷达定位激光雷达建图激光里成计 amp 激光惯性里程计标题点云注册特
  • JavaScript 表单操作以及验证

    大家好 xff0c 我们今天分享一下JavaScript 操作验证表单 首先我们要知道 用JavaScript操作表单和操作DOM是类似的 xff0c 因为表单本身也是DOM树 HTML表单的输入控件 xff08 标签 xff09 主要有以
  • 使用OpenCV查找图像中矩形的位置

    import cv2 image 61 cv2 imread 39 1 jpg 39 blur 61 cv2 pyrMeanShiftFiltering image 11 21 gray 61 cv2 cvtColor blur cv2 C
  • 【GD32F310开发板试用】【001】FreeRTOS移植+“正点原子OLED任务线程”

    首发极术社区 如对兆易创新GD32F310 MCU感兴趣 xff0c 欢迎添加微信 aijishu2020 加入GD32技术讨论群 感谢极术社区提供的SG32F310G测试板 xff0c 尝试移植了一下FreeRTOS顺便点个OLED玩一下
  • apt-get的源

    使用 sudo vim etc apt sources list 修改镜像源 然后执行 sudo apt get update 更新 镜像源如下 xff0c 推荐使用国内源 xff0c 速度更快 镜像源内容转载自 https blog cs
  • Nginx+Keepalived实现站点高可用

    Nginx 43 Keepalived实现站点高可用 发表于 2015 05 18 更新于 2015 05 18 分类于 Linux xff0c Nginx 阅读次数 12301 公司内部 OA 系统要做线上高可用 xff0c 避免单点故障
  • 计算模型的FLOPs

    为了探究影响模型运行时间的变量 xff0c 之前运用了参数量做标准 参数量在TF框架下还是很容易计算的 TF框架下运用 tf span class token punctuation span keras span class token