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跟並行度等。