相关Flops的介绍

2020CVPR文章已陆续发出,现在开始要跟进 成果(干掉张伟)。

 今天主要看的这篇GhostNet,但是我们并不是主要说的是GhostNet中的Ghost Module,后期在专门整理一篇,关于ShuffleNet V1/V2以及MobileNet V1/V2等轻量级网络的资料整理,我们今天主要分析的是里面做的指标分析FLOPs。关于这个FlOPs是啥,如何计算FLops,以及Flops是不是越大就越好。带着几个问题,我们一个一个来看。

1. 首先关于FLOPs:

有个很相似的词儿,叫FLOPS,字母 全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。(硬件)这个不是我们深度学习里面说的运算量,我们说的Flops是指s小写,指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。(模型) 在论文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)。

Flops最早是于2017年,ICIR收录了NVIDIA发表的一篇论文,在这篇论文的附录里,NVIDIA详细的讲解了一下FLOPs的计算。PRUNING CONVOLUTIONAL NEURAL NETWORKS FOR RESOURCE EFFICIENT INFERENCE

2. 如何计算FLops

其中就是指计算量的大小,表示FLOPs。对于卷积层而言,FLOPs的计算公式如下:

egin{equation}
mathrm{FLOPs}=2 H Wleft(C_{i n} K^{2}+1 ight) C_{o u t}
end{equation}

其中的$C_{in}$是指卷积层输入tensor的通道数,$C_{out}$指的是卷积层输出tensor的通道数。K指的是卷积核大小。

而后把常数项去掉,简化小操作:

egin{equation}
mathrm{FLOPs}=H Wleft(C_{i n} K^{2} ight) C_{o u t}
end{equation}

 而在实际中,我们不可能自己计算FLOPs,所以,本着能找库就找库的聪明才能,查了一下,还真有相关计算FLOPs的库,现查到的有两个库,一个是torchstat以及thop。经过测试,基本上两个可以对齐的,所以说,任意选择一个就好。具体用法写两个小demo吧。

对于torchstat:

from torchstat import stat
import torchvision.models as models

model = model.densenet121()
stat(model, (3, 224, 224))

对于thop:

from torchvision.models import densenet121
from thop import profile
model = densenet121()
input = torch.randn(1, 3, 224, 224)
macs, params = profile(model, inputs=(input, ))

3. Flops是不是越大就越好

其实在文章中,指出FLOPs是一个不直接的衡量指标,不像延迟跟速度,是很直观的指标。

 具有相似FLOPs的网络,执行的速度却不一样,有的相差还是很大的,具体的图可以在一下参考中,找到大佬们简书中写的文章。

所以,不能只使用FLOPs来当做指标。还得考虑更多的MAC跟并行度等。

https://zhuanlan.zhihu.com/p/67009992

原文地址:https://www.cnblogs.com/zonechen/p/12371590.html