当前位置: > 财经>正文

CNN 模型所需的计算力flops是什么?怎么计算? 外汇交易保险金怎么算的呢知乎

2023-07-26 00:10:35 互联网 未知 财经

写在前面的话

最近看到一些文章中有关于模型的计算力消耗问题,也就是flops。论文中通常会比较在差不多的flops上两个模型的差距。比如说DenseNet 中就放出了一张在flops差不多的情况下,其与Resnet的对比图来说明DenseNet所需计算力小而正确率高的优势。那么,flops到底是什么?怎么体现模型所需的计算力消耗的?又是怎么计算的呢?本篇文章总结了以上三个问题,同时给出了计算flops的开源库。

一、什么是flops

对flops有疑惑,首先得先捋清这个概念:

FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。

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

我们知道,通常我们去评价一个模型时,首先看的应该是它的精确度,当你精确度不行的时候,你和别人说我的模型预测的多么多么的快,部署的时候占的内存多么多么的小,都是白搭。但当你模型达到一定的精确度之后,就需要更进一步的评价指标来评价你模型:1)前向传播时所需的计算力,它反应了对硬件如GPU性能要求的高低;2)参数个数,它反应所占内存大小。为什么要加上这两个指标呢?因为这事关你模型算法的落地。比如你要在手机和汽车上部署深度学习模型,对模型大小和计算力就有严格要求。模型参数想必大家都知道是什么怎么算了,而前向传播时所需的计算力可能还会带有一点点疑问。所以这里总计一下前向传播时所需的计算力。它正是由FLOPs体现,那么FLOPs该怎么计算呢?

二、如何计算flops

我们知道,在一个模型进行前向传播的时候,会进行卷积、池化、BatchNorm、Relu、Upsample等操作。这些操作的进行都会有其对应的计算力消耗产生,其中,卷积所对应的计算力消耗是所占比重最高的。所以,我们这里主要讲一下卷积操作所对应的计算力。

我们以下图为例进行讲解:

作者:冷月@知乎

先说结论:卷积层 计算力消耗 等于上图中两个立方体 (绿色和橙色) 体积的乘积。即flops =

推导过程:卷积层 wx + b 需要计算两部分,首先考虑前半部分 wx 的计算量:

令 :

k 表示卷积核大小;c 表示输入 feature map 的数量;

则对于输出 feature map 上的单个 Unit 有:

k * k * c 次乘法,以及 k * k * c - 1 次加法

用上图形象化解释就是:

Image大小为 5x5,卷积核大小为 3x3,那么一次3x3的卷积(求右图矩阵一个元素的值)所需运算量:(3x3)个乘法+(3x3-1)个加法 = 17。要得到右图convolved feature (3x3的大小):17x9 = 153

如果输出 feature map 的分辨率是 H * W ,且输出 o 个 feature map,则输出 feature map 包含 Unit的总数就是 H * W * o。

因此,该卷积层在计算 wx 时有:

k * k * c * H * W * o 次乘法 --(1)(k * k * c - 1) * H * W * o 次加法 --(2)

再考虑偏置项 b 包含的计算量:

由于 b 只存在加法运算,输出 feature map 上的每个 Unit 做一次偏置项加法。因此,该卷积层在计算偏置项时总共包含:

H * W * o 次加法 --(3)

将该卷积层的 wx 和 b 两部分的计算次数累计起来就有:

式(1) 次乘法:

k * k * c * H * W * o 次乘法

式(2) + 式(3) 次加法:

(k * k * c - 1) * H * W * o + H * W * o = k * k * c * H * W * o

可见,式(2) + 式(3) = 式 (1)

对于带偏置项的卷积层,乘法运算和加法运算的次数相等,刚好配对。定义一次加法和乘法表示一个flop,该层的计算力消耗 为:

k * k * c * H * W * o

刚好等于图中两个立方体(绿色和橙色)体积的乘积。全连接层的算法也是一样。

三、计算flops的开源库作者:留德华叫兽@知乎

示例代码如下,它求出了VGG16的flops和参数量:

可以看到,算上import 和 print()也仅仅6行代码!不仅输出了整个框架的复杂度,还能输出每一层的复杂度 以及 该层占整个网络的比重

最后贴出常见backbone的flops:

相关阅读:

【1】

【2】

【3】

欢迎关注公众号,阅读

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。