深度学习-模型转换_所需算力相关
模型转换相关
tensflow转onnx
python -m tf2onnx.convert \--graphdef /root/autodl-tmp/warren/text-detection-ctpn/data/ctpn.pb \--output ./model.onnx --inputs Placeholder:0 --outputs Reshape_2:0,rpn_bbox_pred/Reshape_1:0
pytorch转onnx
#!/usr/bin/env python3import torchfrom simple_net import SimpleModel# Load the pretrained model and export it as onnxmodel = SimpleModel()model.eval()checkpoint = torch.load("weight.pth", map_location="cpu")model.load_state_dict(checkpoint)# Prepare input tensorinput = torch.randn(1, 1, 28, 28, requires_grad=True)#batch size-1 input cahnne-1 image size 28*28# Export the torch model as onnxtorch.onnx.export(model,input,'model.onnx', # name of the exported onnx modelopset_version=11,export_params=True,do_constant_folding=True)
模型所需算力测算
手动测算
网络代码
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.conv1 = nn.Conv2d(1,10,5) #1 input channel 10 outchannel 5 kernel sizeself.conv2 = nn.Conv2d(10,20,3) #same as aboveself.fc1 = nn.Linear(20*10*10,500) #in / outself.fc2 = nn.Linear(500,10) #same as abovedef forward(self, x):input_size = x.size(0)x = self.conv1(x) #in batch*1*28*28 out batch*10*24*24(28-5+1)x = F.relu(x) #keep shape not change out batch*10*24*24x = F.max_pool2d(x,2,2) #in batch*10*10*24 out batch*10*12*12(24/2)x = self.conv2(x) #in batch*10*12*12 out:batch 20*10*10(12-3+1)x = F.relu(x)x = x.view(input_size,-1) #flatten -1:caculate dimens autoly 20*10*10x = self.fc1(x)# in :batch*2000 out batch*500x = F.relu(x) #keep sahpe not changex = self.fc2(x) #in 500 out 10output = F.log_softmax(x,dim=1) #caculate possibility#print("------------------------------output is ",output)return output
计算过程:
参数量
conv1层:1( input channel) * 10 (output channels) * 5 * 5 (kernel size) + 10 (bias) = 260 个参数
conv2层:10 (input channels )* 20 (output channels )* 3 * 3( kernel size) + 20 (bias)= 1820 个参数
fc1全连接层:20 * 10 * 10 (20个通道,每个通道大小为10*10) * 500 (输出大小) + 500 bias = 1000500 个参数
fc2全连接层:500 (输入大小) * 10 (输出大小) + 10 bias = 5010 个参数
总参数量为:260 + 1820 + 1000500 + 5010 = 1010120 个参数
Macs
1)conv1 层的FLOPs计算:
conv1 层是一个卷积层,输入大小为 batch * 1 * 28 * 28(假设batch大小为B,输入通道数为1,高度为28,宽度为28),输出大小为 batch * 10 * 24 * 24(输出通道数为10,高度为24,宽度为24)。在卷积操作中,每个输出位置需要进行一个 5 * 5 的卷积操作。因此,计算FLOPs的公式为:
其中,B为batch大小为1
FLOPs_conv1 = B * 10 * 24 * 24 * 5 * 5=14400
2)conv2 层的FLOPs计算:
conv2 层也是一个卷积层,输入大小为 batch * 10 * 12 * 12,输出大小为 batch * 20 * 10 * 10。在卷积操作中,每个输出位置需要进行一个 3 * 3 的卷积操作。因此,计算FLOPs的公式为:
FLOPs_conv2 = B * 20 * 10 * 10 * 3 * 3
3)fc1 全连接层的FLOPs计算:
fc1 全连接层将二维的特征图展平为一维向量,并进行全连接操作。输入大小为 batch * (20 * 10 * 10)(即展平后的大小),输出大小为 batch * 500。在全连接操作中,每个输出位置需要进行一个乘法和一个加法操作。因此,计算FLOPs的公式为:
FLOPs_fc1 = B * (20 * 10 * 10) * 500 * 2
4)fc2 全连接层的FLOPs计算:
fc2 全连接层将输出大小从 500 减少到 10。输入大小为 batch * 500,输出大小为 batch * 10。在全连接操作中,每个输出位置需要进行一个乘法和一个加法操作。因此,计算FLOPs的公式为:
FLOPs_fc2 = B * 500 * 10 * 2
5)现在我们将这四层的FLOPs相加得到总体的FLOPs:
总体FLOPs = FLOPs_conv1 + FLOPs_conv2 + FLOPs_fc1 + FLOPs_fc2
总体FLOPs = B * 10 * 24 * 24 * 5 * 5 + B * 20 * 10 * 10 * 3 * 3 + B * (20 * 10 * 10) * 500 * 2 + B * 500 * 10 * 2
由于模型的参数量不依赖于batch大小B,所以FLOPs也不依赖于batch大小B。因此,我们可以直接将batch大小B忽略,得到最终的总体FLOPs:
总体FLOPs = 10 * 24 * 24 * 5 * 5 + 20 * 10 * 10 * 3 * 3 + (20 * 10 * 10) * 500 * 2 + 500 * 10 * 2
总体FLOPs ≈ 149760 + 182000 + 1000000 + 5010 = 1342770 个 FLOPs
6)因此,这个 "SimpleModel" 模型的总体FLOPs为 1342770 个 FLOPs,也就是 1.34 MMac(1.34百万次乘加运算)。
测试代码
'''Author: warrenDate: 2023-08-01 16:22:02LastEditors: warrenLastEditTime: 2023-08-01 16:26:45FilePath: /wzw/MNIST/cal_flops.pyDescription:Copyright (c) 2023 by ${git_name_email}, All Rights Reserved.'''#!/usr/bin/env python3import torchvision.models as modelsimport torch from simple_net import SimpleModelfrom ptflops import get_model_complexity_infoDEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")with torch.cuda.device(0):model = SimpleModel().to(DEVICE)input_data = torch.randn(1, 1, 28, 28)macs, params = get_model_complexity_info(model, (1, 28, 28), 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))
结果
SimpleModel(
1.01 M, 100.000% Params, 1.34 MMac, 100.000% MACs,
(conv1): Conv2d(260, 0.026% Params, 149.76 KMac, 11.199% MACs, 1, 10, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(1.82 k, 0.181% Params, 182.0 KMac, 13.610% MACs, 10, 20, kernel_size=(3, 3), stride=(1, 1))
(fc1): Linear(1.0 M, 99.296% Params, 1.0 MMac, 74.817% MACs, in_features=2000, out_features=500, bias=True)
(fc2): Linear(5.01 k, 0.497% Params, 5.01 KMac, 0.375% MACs, in_features=500, out_features=10, bias=True)
)
Computational complexity: 1.34 MMac
Number of parameters: 1.01 M
参数解释
Params 参数量 Mac乘加运算总数
总参数量:1.01 M(1,010,000个参数),占100.000%。
总浮点运算量(MACs):1.34 MMac(1,340,000次乘加运算),占100.000%。
各层的详细信息:
conv1层:
参数量:0.026%(大约260个参数)
MACs:11.199%(大约149.76 KMac,即149,760次乘加运算)
conv2层:
参数量:0.181%(大约1.82 k个参数)
MACs:13.610%(大约182.0 KMac,即182,000次乘加运算)
fc1全连接层:
参数量:99.296%(大约1.0 M个参数)
MACs:74.817%(大约1.0 MMac,即1,000,000次乘加运算)
fc2全连接层:
参数量:0.497%(大约5.01 k个参数)
MACs:0.375%(大约5.01 KMac,即5,010次乘加运算)
总体计算复杂度:1.34 MMac(1,340,000次乘加运算)。
总参数量:1.01 M(1,010,000个参数)。
相关文章:
深度学习-模型转换_所需算力相关
模型转换相关 tensflow转onnx python -m tf2onnx.convert \--graphdef /root/autodl-tmp/warren/text-detection-ctpn/data/ctpn.pb \--output ./model.onnx --inputs Placeholder:0 --outputs Reshape_2:0,rpn_bbox_pred/Reshape_1:0 pytorch转onnx #!/usr/…...

Koordinator 助力云原生应用性能提升:小红书混部技术实践
作者:宋泽辉(小红书)、张佐玮(阿里云) 编者按: Koordinator 是一个开源项目,是基于阿里巴巴内部多年容器调度、混部实践经验孵化诞生,是行业首个生产可用、面向大规模场景的开源混…...

java中如何使用elasticsearch—RestClient操作文档(CRUD)
目录 一、案例分析 二、Java代码中操作文档 2.1 初始化JavaRestClient 2.2 添加数据到索引库 2.3 根据id查询数据 2.4 根据id修改数据 2.4 删除操作 三、java代码对文档进行操作的基本步骤 一、案例分析 去数据库查询酒店数据,导入到hotel索引库࿰…...
MySQL自定义函数
MySQL自定义函数 函数与存储过程类似,也是一组预先编译好的SQL语句的集合,但是存储过程可以有0个或多个返回,函数就只能有一个返回 创建函数 #语法 参数列表包含两部分 参数名和参数类型 #函数体必须有return语句 且每个sql语句后要以;结尾 所…...
技术学习|CDA level I 数据库应用(数据操作语言DML)
数据操作语言(DML)是对表中记录进行添加、更新、删除等操作的语言。 一、添加数据 在数据表中填充数据有两种方法,第一种方法是使用insert into语句向数据表中直接录入每行数据信息,但并不常用,因为分析使用的数据很…...

关键字:instanceof关键字
在 Java 中,instanceof关键字用于检查一个对象是否是某个特定类或其子类的实例。它的语法如下: 其中,Object是要检查的对象,Class是要检查的类或接口。 instanceof关键字的返回值是一个布尔值,如果对象Object是类Cla…...

【LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置 | 二分】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

年度征文|回顾2023我的CSDN
一年转眼而逝,回顾这一年在csdn的创作,学习,记录历程。回顾过去,才能展望未来,首先看图说话。 今年在csdn的访问量已由年初的2万到年末的50w。粉丝有年初的300个左右,增加到4000个左右。我年初的目标是粉丝…...
3.无重复字符的最长子串(滑动窗口,C解答)
题目描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb&quo…...
什么是系统设计 – 学习系统设计
系统设计被定义为为系统的不同组件、接口和模块创建架构并提供有助于在系统中实现这些元素的相应数据的过程。系统设计是任何分布式系统设计背后的核心概念。 系统设计涉及识别数据源,它是描述、创建和规划框架以满足特定业务的必要性和先决条件的直觉。 为什么要…...

基于Python的城市热门美食数据可视化分析系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本项目利用网络爬虫技术从XX点评APP采集北京市的餐饮商铺数据,利用数据挖掘技术对北京美食的分布、受欢迎程度、评价、评论、位置等情况进行了深入分析,方便了解城市美食店…...

万字长文谈自动驾驶occupancy感知
文章目录 prologue欢迎大家点赞收藏与我交流讨论paper listVision-based occupancy :1. [MonoScene: Monocular 3D Semantic Scene Completion [CVPR 2022]](https://arxiv.org/pdf/2112.00726.pdf)2. [Tri-Perspective View for Vision-Based 3D Semantic Occupancy Predictio…...

KBDNO1.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复
不少小伙伴,求助电脑报错“KBDNO1.DLL文件缺失,软件或游戏无法启动或运行”,应该怎么办? 首先,我们先来了解“KBDNO1.DLL文件”是什么? KBDNO1.DLL是Windows操作系统中的一个动态链接库文件,主…...

计算机网络【EPOLL 源码详解】
IO多路复用 在以前,传统的网络编程是多线程模型,一个线程单独处理一个请求。 然而,线程是很昂贵的资源: 线程的创建和销毁成本很高,linux的线程实际上是特殊的进程;因此通常会使用线程池来减少线程创建和…...
第82讲:MySQL Binlog日志的滚动
MySQL Binlog日志的滚动 MySQL Binlog日志滚动指的就是产生一个新的Binlog日志,然后进行记录,因为如果都在一个Binlog中记录,查询是非常慢的,检索的效率也很低。 Binlog日志滚动有三种方法: 重启MySQL 数据库一般不重…...
2024.1.3C语言补录 宏函数
在C语言中,宏函数可以使用预处理器指令 #define 来定义。宏函数与常规函数类似,但它们在预处理阶段进行替换,而不是在运行时。 定义:#define 宏名称(参数列表) 宏体 其中: #define 是预处理器指令,用于定义宏。宏名…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Column组件 沿垂直方向布局的容器。 子组件 可以包含子组件。 接…...

快手推荐算法工程师三面回顾
快手三次技术面试一次HR面试的简单回顾,希望对大家有所启发。 一面 面试官一上来就让写算法题,第一个是计算岛屿数量,第二个是最长回文字串。 然后就是介绍自己的论文。对于论文的工作,面试官只是在问关于论文的问题࿰…...

Sonarqube安装(Docker)
一,拉取相关镜像并运行 # 拉取sonarqube镜像 docker pull sonarqube:9.1.0-community在运行之前要提前安装postgres并允许,新建数据库名为sonar的数据库 Docker安装postgres教程 docker run -d --name sonarqube --restartalways \ -p 19000:9000 \ …...

双击shutdown.bat关闭Tomcat报错:未设置关闭端口~
你们好,我是金金金。 场景 当我startup.bat启动tomcat之后,然后双击shutdown.bat关闭,结果报错了~ 排查 看报错信息很明显了,未配置关闭端口,突然想起来了我在安装的时候都选的是默认的配置,我还记得有这…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...