【深度学习】关于CNN网络的FLOPs的计算

2023-12-13 16:08

本文主要是介绍【深度学习】关于CNN网络的FLOPs的计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在评估一个CNN网络的计算复杂度时,浮点数运算(float point operation)是一个常用的衡量指标。注意本文介绍的主要是MAC(乘法加法操作),在一些论文里是仅仅考虑乘法操作的。

在常规的计算中,通常不考虑非线性函数的计算量(the nonlinearity),对于卷积操作:(带bias)

F L O P s = 2 ∗ H W ∗ ( C i n K 2 + 1 ) C o u t = 2 ∗ ( H W K 2 C i n C o u t + H W C o u t ) FLOPs = 2*HW*(C_{in}K^{2}+1)C_{out} \\ =2*(HWK^{2}C_{in}C_{out} +HW C_{out}) FLOPs=2HW(CinK2+1)Cout=2(HWK2CinCout+HWCout)

此处经评论提醒,已更正
其中式子中 H W K 2 C i n C o u t HWK^{2}C_{in}C_{out} HWK2CinCout为卷积操作, H W C o u t HWC_{out} HWCout为bias操作,2则表示为MAC操作(包含累加及累乘)

上面是NVIDIA在文章《PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE》文章中的计算方式。

但有人认为这是一种估算,他们认为对于卷积的计算量计算如下(不含bias):

F L O P s = ( 2 ∗ C i n ∗ K 2 − 1 ) ∗ H ∗ W ∗ C o u t FLOPs = (2*C_{in}*K^{2} - 1) * H * W * C_{out} FLOPs=(2CinK21)HWCout

其中第一个括号可拆成 ( C i n ∗ K 2 + C i n ∗ K 2 − 1 ) (C_{in} * K^{2} + C_{in} * K^{2} -1) (CinK2+CinK21),原因是n个数相加需要n-1次加法,此处不含bias。若没有-1则是带bias的计算方式。他们认为Nvidia是一种估算。

实际上两种计算的差别不是很大。

对于全连接操作:输入维度 I I I,输出维度 O O O,则全连接层(不含bias):

F L O P s = ( 2 × I − 1 ) × O FLOPs = (2 \times I-1) \times O FLOPs=(2×I1)×O

全连接操作,含bias:

F L O P s = 2 × I × O FLOPs = 2 \times I \times O FLOPs=2×I×O

这里是没有考虑全连接中的bias操作,比如x1+x2+…xn只有(n-1)次加法。

Ref:

  1. PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE
  2. https://www.zhihu.com/question/65305385/answer/451060549

这篇关于【深度学习】关于CNN网络的FLOPs的计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/489075

相关文章

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如