神经网络各个层FLOPs的计算

• FLOPS 注意全部大写 是floating point of per second的缩写,意指每秒浮点运算次数。可以理解为计算速度,用来衡量硬件的性能。
• FLOPs 是floating point of operations的缩写,是浮点运算次数,理解为计算量,可以用来衡量算法/模型复杂度。(ps:FLOPs 是模型推理时间的一个参考量,但并不能百分百表示该模型推理时间的长短,因为乘法和加法计算不一样,乘法的时间一般是加法时间的四倍,但现在有很多优化卷积层的计算算法,可能把乘法计算时间缩为加法的两倍不等,所以FLOPs只是个估量的指标,不是决定推理时间长短的指标。即FLOPs越小并不代表着模型推理时间越短)
定义在这篇论文有:

这篇论文PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE所描述的计算公式跟博客所搜的不一样,经推导,大佬的这篇博客https://zhuanlan.zhihu.com/p/366184485的推导非常不错,通俗易懂。在该博客上提及的就不多赘述。
1.标准卷积的FLOPs计算
标准卷积的推导过程,大佬们描述得很清楚,在此只贴上手绘的卷积过程图示,如图1所示:

标准卷积的卷积过程可比喻为输入大的面包块(输入的特征图)进行相应的空间映射为更加贴近目标(目标即期望的输出)的大面包块(输出特征图),而要输出这个贴近目标的大面包块,需要用一个学习的小面包块(卷积核)在输入的大面包块里面寻找与目标相似的面包块。(ps:这个卷积的思想也被一篇跟踪的论文应用了,把跟踪问题当成检测,用模板当成卷积核,然后再与输入的特征图做卷积,找图片中与模板最相似的特征块。)
卷积就是通过卷积核在特征图上进行乘加运算,每移动一次窗口,即计算一个输出特征图的点,就需要k_h×k_w×Cin乘法和k_h×k_w×Cin-1次加法,要做W-out×H_out×Cout次乘法和加法,再加上W-out×H_out×Cout个bias,则FLOPs = (k_h×k_w×Cin+k_h×k_w×Cin-1)×W-out×H_out×Cout+W-out×H_out×Cout = 2×k_h×k_w×Cin×W-out×H_out×Cout
2.深度可分离卷积的FLOPs计算。
深度可分离卷积可看成是根据通道切输入的特征图,切成一片一片的(输入的特征图可看成是一块面包块,输入的特征图的高H_in作为面包的长,输入的宽W_in作为面包的宽,输入通道的Channel当成面包的高,深度可分离卷积就是把面包块切成一片片的即W_in×H_in×1),然后用Cout个卷积核k_h×k_w×1进行卷积,则最后得到H_out×W_out×Cout的大面包块,根据标准卷积的FLOPs的推导过程,可得:
一个面包片进行卷积,乘法次数有:k_h×k_w×1×H_out×W_out,加法的次数有(k_h×k_w×1-1)×H_out×W_out,bias有H_out×W_out,则一个面包片进行卷积的FLOPs= k_h×k_w×1×H_out×W_out+(k_h×k_w×1-1)×H_out×W_out+H_out×W_out = ( k_h×k_w×1-(k_h×k_w×1-1)+1)×H_out×W_out = 2×k_h×k_w×1×H_out×W_out,一共有Cout个面包片,一个深度可分离卷积的FLOPs计算公式为:
FLOPs_DepthConv=2×k_h×k_w×1×H_out×W_out×Cout
深度可分离卷积过程的图示如图1所示:

3.全连接层的FLOPs计算。
把全连接当成是全局卷积,则其FLOPs的计算公式为:(H_out= W_out=1, k_h=H_in,k_w=W_in)
FLOPs_fc=2×k_h×k_w×Cin× Cout ×H_out×W_out=2× H_in × W_in ×Cin×Cout

4.池化层的FLOPs计算。
参照该博客https://blog.csdn.net/CVSvsvsvsvs/article/details/90477062的池化层作用机制,可知,池化核这个filter是不需要保留参数的,不同于conv filter, 每一个pooling filter就是一个固定的函数。也相似于深度可分离卷积是把输入的面包块切成片,池化核在面包片上进行池化,由于池化就是比较大小或者是求均值等,则在一个面包片上池化层的运算次数为:k_h×k_w×H_out×W_out(如MaxPooling,初始化一个负无穷的数,求每个池化核的最大值,则要比较k_h×k_w×H_out×W_out次),有Cin个面包片。则一共有k_h×k_w×H_out×W_out×Cin次运算。则:
FLOPs_pooling=k_h×k_w×H_out×W_out*Cin
(如果是a平均池化层avePooling,加法次数有:(k_h×k_w-1)×H_out×W_out,除法次数(看做是乘法)有:H_out×W_out,则一个面包片上平均池化层的运算次数为:k_h×k_w×H_out×W_out,那么计算FLOPs方式和MaxPooling一样)。

如果是全局Pooling,则k_h=H_in, k_w=W_in, H_out= W_out=1,该公式同样通用,不用特意转成FLOPs_globalpooling= W_in × H_in×Cin

5.ReLU层的FLOPs计算。
relu函数f(x)=max(x,0),则是对输入的大面包块逐点进行一次比较,进行了H_in×W_in×Cin,则FLOPs_relu=H_in×W_in×Cin
6.Sigmoid层的FLOPs计算。
Sigmoid函数f(x)=1/(1+e-x),进行一次函数运算,就有+、-、e^x和倒数的计算,也就有四个运算操作,则它的FLOPs是relu的四倍FLOPs_relu=H_in×W_in×Cin
7.其它的层
只要知道神经网络各个层的前传计算方式就能得到其FLOPs(比如Eltwise层中的加操作,它前传的原理是两个相同特征图(H_in×W_in×Cin)的像素点相加,则该层有H_in×W_in×Cin次加法,其FLOPs_Eltwise=H_in×W_in×Cin)。

神经网络层的FLOPs计算相关推荐

  1. 机器学习笔记:神经网络层的各种normalization

    1 Normalization的引入 1.1 独立同分布 机器学习,尤其是深度学习的模型,如果它的数据集时独立同分布的(i.i.d.  independent and identically dist ...

  2. 神经网络中参数量parameters和FLOPs计算

    一.神经网络中参数量parameters和FLOPs计算 CNN中的parameters分为两种:W和b,对于某一个卷积层,它的parameters的个数为: (Kh∗Kw∗Cin)∗Cout+Cou ...

  3. pytorch 模型可视化_PyTorch Tips(FLOPs计算/参数量/计算图可视化/相关性分析)

    最近在做Research Project的时候,发现有些小工具很好用,记录在此. 1. 准确的FLOPS 计算 网上开源的很多计算flops的工具只支持计算PyTorch内置层的flops,不能有效计 ...

  4. (*长期更新)软考网络工程师学习笔记——数据链路层与网络层的相关计算题

    目录 前言 一.海明码校验码的计算 二.最小帧长的计算 三.求默认网关地址 四.网络地址.主机地址.广播地址的区分和求解 五.判断是否属于网络或子网的主机地址 六.子网划分和求子网掩码 七.子网范围和 ...

  5. PyTorch中FLOPs计算问题

    最近看了很多关于FLOPs计算的实现方法,也自己尝试了一些方法,发现最好用的还是PyTorch中的thop库(代码如下): device = torch.device("cuda" ...

  6. 网络参数和Flops计算

    网络参数和Flops计算 网络参数计算 1. 卷积层 2. 线性层 3. 归一化层 Flops 1. 卷积层 2. 线性层 3. 归一化 计算的模块 网络参数计算 1. 卷积层 假设输入维度为m,输出 ...

  7. 深度学习中FLOPs计算

    深度学习中FLOPs计算 定义:FLOPs(floating point operations),即浮点数运算次数,是一个计算量,所以可以用来衡量一个算法/模型等的复杂度 FLOPs是用来计算整个网络 ...

  8. python 人脸识别:从入门到精通 (5.4)常用的神经网络层

    第5章 深度学习与Keras工程实践 5.4 常用的神经网络层 5.4.1 全连接层 keras.layers.Dense(units,activation=None,use_bias=True,ke ...

  9. CNN中parameters和FLOPs计算

    CNN中parameters和FLOPs计算 以AlexNet为例,先注意观察每层编注的通道数的变化. 1. 卷积网络的参数量的计算(parameters) CNN中的parameters分为两种:W ...

最新文章

  1. 卷毛机器人抢大龙视频_腾讯这一措施,又砸碎了一些小企业的饭碗,QQ机器人成为历史...
  2. 2019年上半年收集到的人工智能自然语言处理方向干货文章
  3. 无法获取到图片的宽高
  4. DDD - 聚合与聚合根_如何理解 Respository与DAO
  5. 《Enterprise Library深入解析与灵活应用》博文系列汇总
  6. 使用tensorflow预测函数的参数值(a simple task)
  7. python3.6+qt designer一系列配置
  8. 【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)
  9. ROS在类中发布和接受消息(自定义消息)
  10. 计算机图形学前沿领域的设想,计算机图形学
  11. layer右下脚弹窗
  12. 如何使用云效看板,让需求持续快速地流动和交付...
  13. 拉起客户端 Universal Links Scheme Open App iOS(Deep Link)
  14. IDM的Google商店插件
  15. php云erp进销存v8安装,PHP仿金蝶云ERP进销存V8网络多仓版源码
  16. 什么是TOC? 论文不通过?TOC请了解一下 | SCI-HUA科画技法
  17. NoteExpress的使用方法
  18. 大型网站 + 静态页面
  19. 手机电池续航一天不如一天?
  20. Substrate框架:平行链及跨链技术简析 结合ETH和IPFS能否成为第一跨链系统?

热门文章

  1. Java IDE大比拼
  2. 【图片新闻】冷战期间英国人设计的“蓝孔雀”核地雷
  3. 揭秘套路:百度贴吧诱导用户操作CPA项目
  4. 用某宝上的板子制作可调的正负电源
  5. Dev-C++5.11游戏创作之吃豆人小游戏(转载)
  6. 2018年12月云栖技术活动最全资料汇总:50+直播与Meetup分享...
  7. CHM文件打开空白是什么原因
  8. MySQL - 07 SQL函数的使用
  9. 屏幕输出类似LED显示屏效果的字母拼图
  10. Vxworks学习(三)_驱动