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的计算公式如下:
\begin{equation}
\mathrm{FLOPs}=2 H W\left(C_{i n} K^{2}+1\right) C_{o u t}
\end{equation}
其中的$C_{in}$是指卷积层输入tensor的通道数,$C_{out}$指的是卷积层输出tensor的通道数。K指的是卷积核大小。
而后把常数项去掉,简化小操作:
\begin{equation}
\mathrm{FLOPs}=H W\left(C_{i n} K^{2}\right) 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跟并行度等。