深度學習之alexnet的計算量

前言
深度學習的計算量


上表列舉了,ImageNet圖像識別中常見算法的模型大小以及單張圖片一次訓練(One Pass)所需要的計算量。

自2012年,Hinton的學生Alex Krizhevsky提出AlexNet,一舉摘下ILSVRC 2012的桂冠後,ILSVRC比賽冠軍的準確率越來越高。與此同時,其中使用到的深度學習算法也越來越複雜,所需要的計算量也越來越大。SENet與AlexNet相比,計算量多了近30倍。我們知道,ImageNet大概有120萬張圖片,以SENet爲例,如果要完成100個epoch的完整訓練,將需要2.52 * 10^18的計算量。如此龐大的計算量,已經遠遠超出傳統的機器學習算法的範疇。更別說,Google在論文《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era》中提及的、比ImageNet大300倍的數據集。

物理計算性能
面對如此龐大的計算量,那麼,我們業界當前常用的計算單元的計算力是多少呢?

CPU 物理核:一般浮點運算能力在10^10 FLOPS量級。一臺16 Cores的服務器,大致上有200 GFLOPS的運算能力。實際運行,CPU 大概能用到80%的性能,那就160 GFLOPS的運算能力。完成上述SENet運行,需要182天。
NVIDIA GPGPU: 目前的V100,單精度浮點運算的峯值大概爲14 TFLOPS, 實際運行中,我們假設能用到50%的峯值性能,那就是7 TFLOPS,需要4天。
根據以上數據結果可以看出:在深度學習領域,GPU訓練數據集所需要耗費的時間,遠遠少於CPU,這也是當前深度學習訓練都是採用GPU的重要原因。

1. AlexNet網絡結構回顧
2012年AlexNet在ImageNet大賽上一舉奪魁,開啓了深度學習的時代,雖然後來大量比AlexNet更快速更準確的卷積神經網絡結構相繼出現,但是AlexNet作爲開創者依舊有着很多值得學習參考的地方,它爲後續的CNN甚至是R-CNN等其他網絡都定下了基調,所以下面我們將從AlexNet入手,理解卷積神經網絡的一般結構。

基本結構
先給出AlexNet的一些參數和結構圖:

卷積層:5層
全連接層:3層
深度:8層
參數個數:60M
神經元個數:650k
分類數目:1000類
AlexNet結構圖:

由於當時的顯卡容量問題,AlexNet 的60M個參數無法全部放在一張顯卡上操作,所以採用了兩張顯卡分開操作的形式,其中在C3,R1,R2,R3層上出現交互,所謂的交互就是通道的合併,是一種串接操作。

AlexNet中的卷積層
在AlexNet中,卷積層是上圖所示的C1……C5,一共5層。而每次卷積後的結果在上圖中可以看到,比如經過卷積層C1後,原始的圖像變成了55*55的尺寸,一共有96個通道,分佈在2張3G的顯卡上,所以上圖中一個立方體的尺寸是55×55×4855×55×4855×55×48,48是通道數目(後面會詳細的說明),而在這個立方體裏面還有一個5×5×485×5×485×5×48的小立方體,這個就是C2卷積層的核尺寸,48是核的厚度(後面會詳細說明)。這樣我們就能看到它每一層的卷積核尺寸以及每一層卷積之後的尺寸。我們按照上面的說明,推到下每一層的卷積操作:

需要說明的是,雖然AlexNet網絡都用上圖的結構來表示,但是其實輸入圖像的尺寸不是224×224×3224×224×3224×224×3,而應該是227×227×3227×227×3227×227×3,大家可以用244的尺寸推導下,會發現邊界填充的結果是小數,這顯然是不對的,在這裏就不做推導了。

輸入層:227×227×3
C1:96×11×11×3 (卷積核個數/寬/高/厚度)
C2:256×5×5×48(卷積核個數/寬/高/厚度)
C3:384×3×3×256(卷積核個數/寬/高/厚度)
C4:384×3×3×192(卷積核個數/寬/高/厚度)
C5:256×3×3×192(卷積核個數/寬/高/厚度)

針對這五層卷積,說明一下三點:
1.推導下C1後的輸出是什麼:
用11×11×3的卷積核卷積227×227×3的圖像,卷積後的尺寸是55×55×1。這是因爲:
(227−11+2×0)4+1=55\frac{\left ( 227-11+2\times0 \right )}{4}+1=55
4
(227−11+2×0)
​    
 +1=55

卷積核的個數爲96,但是48個在一張顯卡上,剩餘48個在另一張顯卡上。所以單張顯卡上的通道數爲48,2爲顯卡個數。
最後的輸出:55×55×48×255×55×48×2
而剩下的層數與上述推導式相同的,我們可以逐層確定輸出是什麼。
2.注意推到過程中的池化操作
在C1,C2,C5的卷積操作後,圖像做了最大池化(後面會說),這會影響輸出圖片的尺寸。
3.C3卷積層的特殊性


看下上面這張圖,由於分顯卡操作,上一層的輸出通道數(也就是卷積核的個數)總會是下一層卷積層卷積核厚度的2倍。但是C3是特殊的,這是爲啥呢?????

因爲在這裏做了通道的合併,也就是一種串接操作,所以一個卷積核卷積的不再是單張顯卡上的圖像,而是兩張顯卡的圖像串在一起之後的圖像,串在一起之後的通道數就是256,所以卷積核的厚度爲256。

這也就是爲什麼,在這個圖上要畫兩個33128的卷積核,他想表達的意思就是實際的卷積核尺寸是3×3×256!(上面這個結論是我猜的)

2. AlexNet 中60M參數
AlexNet只有8層,但是它需要學習的參數有60000000個,相比如他的層數,這是一個很可怕的數字了,我們來計算下這些參數都是怎麼來的:
C1:96×11×11×396×11×11×396×11×11×3(卷積核個數/寬/高/厚度) 34848個
C2:256×5×5×48256×5×5×48256×5×5×48(卷積核個數/寬/高/厚度) 307200個
C3:384×3×3×256384×3×3×256384×3×3×256(卷積核個數/寬/高/厚度) 884736個
C4:384×3×3×192384×3×3×192384×3×3×192(卷積核個數/寬/高/厚度) 663552個
C5:256×3×3×192256×3×3×192256×3×3×192(卷積核個數/寬/高/厚度) 442368個
R1:4096×6×6×2564096×6×6×2564096×6×6×256(卷積核個數/寬/高/厚度) 37748736個
R2:4096×40964096×40964096×4096 16777216個
R3:4096×10004096×10004096×1000 4096000個

在R1中卷積核尺寸是6×6×256而不是13×13×256是因爲經過了最大池化。可以看到,全連接層(尤其是第一層)參數數量佔了絕大部分。

3. FLOPS計算
有關FLOPS的定義與計算
FLOPS(即“每秒浮點運算次數”,“每秒峯值速度”),是“每秒所執行的浮點運算次數”(floating-point operations per second)的縮寫。它常被用來估算電腦的執行效能,尤其是在使用到大量浮點運算的科學計算領域中。正因爲FLOPS字尾的那個S,代表秒,而不是複數,所以不能省略掉。

一個MFLOPS(megaFLOPS)等於每秒一佰萬(=10^6)次的浮點運算,

一個GFLOPS(gigaFLOPS)等於每秒十億(=10^9)次的浮點運算,

一個TFLOPS(teraFLOPS)等於每秒一萬億(=10^12)次的浮點運算,(1太拉)

一個PFLOPS(petaFLOPS)等於每秒一千萬億(=10^15)次的浮點運算,

一個EFLOPS(exaFLOPS)等於每秒一佰京(=10^18)次的浮點運算。

浮點計算峯值=處理器個數×處理器主頻×每秒可進行的最高浮點運算次數(FMAD,乘加指令)

CPU主頻和浮點運算能力FLOPS的關係
有很多人認爲CPU的主頻就是其運行速度,其實不然。CPU的主頻,即CPU內核工作的時鐘頻率(CPU Clock Speed)。CPU的主頻表示在CPU內數字脈衝信號震盪的速度,與CPU實際的運算能力並沒有直接關係。主頻和實際的運算速度存在一定的關係,但至今還沒有一個確定的公式能夠定量兩者的數值關係,因爲CPU的運算速度還要看CPU的流水線的各方面的性能指標(緩存、指令集、CPU的位數等等)。

由於主頻並不直接代表運算速度,所以在一定情況下,很可能會出現主頻較高的CPU實際運算速度較低的現象。比如AMD公司的AthlonXP系列CPU大多都能以較低的主頻,達到英特爾公司的Pentium 4系列CPU較高主頻的CPU性能,所以AthlonXP系列CPU才以PR值的方式來命名。因此主頻僅是CPU性能表現的一個方面,而不代表CPU的整體性能。CPU的主頻不代表CPU的速度,但提高主頻對於提高CPU運算速度卻是至關重要的。

矩陣乘法的浮點運算次數如何計算
假設有m * n的矩陣A, 和n * o的矩陣B, 則最終會形成m * o的矩陣C (C = A * B)
其中n是A的寬度, 也是B的高度.

最終總的運算量需要m * o * n次乘加.
將1次乘加看成兩次運算(一次乘法, 一次加法),
則最終需要 2 * m * o * n次運算, 這是總的浮點數運算量

AlexNet的需要的浮點能力計算
同樣從Andrew的前向傳播PPT中,我們也可以看到,這裏的浮點運算主要就是W相關的乘法,以及b相關的加法,每一個W對應W中元素個數個乘法,每一個b對應一個加法,因此好像FLOPs個數和parameters是相同的。

但其實有一個地方我們忽略了,那就是每個feature map上每個點的權值是共享,這是CNN的一個重要特性,也可以說是優勢(因此才獲得特徵不變性,以及大幅減少參數數量),所以我們在計算FLOPs是隻需在parameters的基礎上再乘以feature map的大小即可,即對於某個卷積層,它的FLOPs數量爲:

運用上面的規律,我們便可以很輕鬆地計算出AlexNet網絡的parameters和FLOPs數目,如下圖:


————————————————
版權聲明:本文爲CSDN博主「Never-Giveup」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36653505/article/details/86700885

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章