本文已授權極市平臺,未經允許不得二次轉載,如有需要請私信作者。
在學習slimming操作之前的很重要一步是搞懂模型壓縮領域的指標的含義。很多優秀的CNN模型在部署到端側設備時會遇到困難,主要難在下面這3個方面。它們也是模型壓縮領域關註的3個參數:
就是模型的大小,我們一般使用參數量parameter來衡量,註意,它的單位是個。但是由於很多模型參數量太大,所以一般取一個更方便的單位:兆(M)來衡量。比如ResNet-152的參數量可以達到60 million = 0.0006M。
有些時候,model size在實際計算時除瞭包含參數量以外,還包括網絡架構信息和優化器信息等。比如存儲一個一般的CNN模型(ImageNet訓練)需要大於300MB。
這裡你可能會有疑問:剛才的單位是M,怎麼這裡出來瞭個MB?是不是寫錯瞭?
肯定沒有,我們需要註意這裡的M和MB的換算關系:
所以讀到這裡你應該明白說一個模型的model size,用M和MB其實是一樣的意思。
那你可能還會有疑問:是不是一定要用32位存儲?
這個問題很好,現在的quantization技術就是減少參數量所占的位數:比如我用8位存儲,那麼:
更有甚者使用二值神經網絡進一步減小參數量所占的位數(權值被限制為{-1, 1}或{-1, 0, 1}),後文有論文的鏈接,有空再專門介紹這個方法吧。下面簡單介紹下參數量的計算方法:
卷積層參數量的計算方法:
如圖中第2行所示為卷積核:這些卷積核時權重共享的,所以參數量為:
Params_{w}=K_{in}times K_{out}times C_{in}times C_{out}tag{1}
Params_{b}=C_{out}tag{2}
Params=K_{in}times K_{out}times C_{in}times C_{out}+C_{out}tag{3}
=(K_{in}times K_{out}times C_{in}+1)times C_{out}
全連接層參數量的計算方法:
Params_{w}=N_{in}times N_{out}tag{4}
Params_{b}=N_{out}tag{5}
Params_{}=N_{in}times N_{out}+N_{out}tag{6}
就是模型實際運行時所占的內存。註意這個指標與隻存儲模型參數所占的存儲空間的大小是不一樣的,這個指標更大。這對於GPU來講不算是問題,但是對於硬件能力極為有限的端側設備來說就顯得無法承受瞭。它的單位是兆字節 (MB)。
就是模型的計算量,有FLOPs和MACs兩種衡量的方式、簡而言之,前者指的是乘加的數量,而後者指運算量。比如ResNet-152在前向傳播一張256 * 256的圖片的運算量可以達到20 GFLOPs。下面簡單介紹下模型計算量的計算方法:
第1種:FLOPs:
卷積層FLOPs的計算方法:
隻需在parameters的基礎上再乘以feature map的大小即可,即對於某個卷積層,它的FLOPs數量為:
FLOPs|_{bias}=2K_{in}times K_{out}times C_{in}times C_{out}times H_{out}times W_{out}tag{1}
FLOPs|_{no bias}=(2K_{in}times K_{out}times C_{in}-1)times C_{out}times H_{out}times W_{out}tag{2}
如果計算 bias ,則 K_{in}times K_{out}times C_{in}times C_{out}times H_{out}times W_{out} 為乘法的運算量。
(K_{in}times K_{out}times C_{in}-1)times C_{out}times H_{out}times W_{out} 為加法的運算量。
1times C_{out}times H_{out}times W_{out} 為 bias 的運算量。
全連接層FLOPs的計算方法:
對於全連接層,由於不存在權值共享,它的FLOPs數目即是該層參數數目:
FLOPs_{}=(2N_{in}-1)N_{out}tag{8}
N_{in}N_{out} 為乘法的運算量, (N_{in}-1)N_{out} 為加法的運算量。
第2種:MACs:
MACs與FLOPs的關系:
設有全連接層為:
y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ... + w[n8]*x[8]
上一篇
下一篇