1. 程式人生 > >為什麼要將全連線層轉化為卷積層

為什麼要將全連線層轉化為卷積層

轉自:https://www.cnblogs.com/liuzhan709/p/9356960.html

理解為什麼要將全連線層轉化為卷積層

1.全連線層可以視作一種特殊的卷積

考慮下面兩種情況:

  1. 特徵圖和全連線層相連,AlexNet經過五次池化後得到7*7*512的特徵圖,下一層全連線連向4096個神經元,這個過程可以看做有4096個7*7*512的卷積核和7*7*512的特徵圖進行卷積操作,最終得到1*1*4096的特徵圖,等價與全連線得到4096個神經元。
  2. 全連線層和全連線層相連,AlexNet的再下一層依然是4096個神經元,即4096個神經元和4096個神經元全連線,由(1)我們得到了1*1*4096的特徵圖,本次全連線過程可以看做存在4096個1*1*4096個卷積核,依次和1*1*4096的特徵圖進行卷積操作,等價與全連線。

2.網路改成全卷積形式後在某些場景可以提升效率

CS231課程中有如下陳述: 實際操作中,每次這樣的變換都需要把全連線層的權重W重塑成卷積層的濾波器。那麼這樣的轉化有什麼作用呢?它在下面的情況下可以更高效:讓卷積網路在一張更大的輸入圖片上滑動(譯者注:即把一張更大的圖片的不同區域都分別帶入到卷積網路,得到每個區域的得分),得到多個輸出,這樣的轉化可以讓我們在單個向前傳播的過程中完成上述的操作。

舉個例子,如果我們想讓224x224尺寸的浮窗,以步長為32在384x384的圖片上滑動,把每個經停的位置都帶入卷積網路,最後得到6x6個位置的類別得分。上述的把全連線層轉換成卷積層的做法會更簡便

。如果224x224的輸入圖片經過卷積層和匯聚層之後得到了[7x7x512]的陣列,那麼,384x384的大圖片直接經過同樣的卷積層和匯聚層之後會得到[12x12x512]的陣列(因為途徑5個匯聚層,尺寸變為384/2/2/2/2/2 = 12)。然後再經過上面由3個全連線層轉化得到的3個卷積層,最終得到[6x6x1000]的輸出(因為(12 - 7)/1 + 1 = 6)。這個結果正是浮窗在原圖經停的6x6個位置的得分!

面對384x384的影象,讓(含全連線層)的初始卷積神經網路以32畫素的步長獨立對影象中的224x224塊進行多次評價,其效果和使用把全連線層變換為卷積層後的卷積神經網路進行一次前向傳播是一樣的。自然,相較於使用被轉化前的原始卷積神經網路對所有36個位置進行迭代計算,使用轉化後的卷積神經網路進行一次前向傳播計算要高效

得多,因為36次計算都在共享計算資源。這一技巧在實踐中經常使用,一次來獲得更好的結果。比如,通常將一張影象尺寸變得更大,然後使用變換後的卷積神經網路來對空間上很多不同位置進行評價得到分類評分,然後在求這些分值的平均值。

上面給出了轉化為全卷積的兩個理由,一是不用限制死輸入影象的大小,提供方便。二是前向傳播時效率更高。

我的理解與推理

首先解釋方便,對於384*384的圖片,不修改AlexNet的結構使之適應384*384(依然使用原來224x224輸入的結構),直到經過匯聚層得到[12x12x512]的陣列時,網路執行沒有任何問題,按照原來的架構,接下來要將特徵圖平鋪和4096個神經元全連線,這時候就出問題了,因為原架構平鋪後是7x7,現在是12x12,無法使用之前的引數矩陣了,但是將全連線層轉化為卷積層後可繼續進行,並最終得到6x6的正確輸出,僅僅將網路的全連線層等價轉化為卷積層,就能接收更大的圖片,這顯然方便了很多。

然後解釋高效,第一層卷積,對於224x224的一張圖片,假設卷積耗時為t,那麼前向傳播時,36張圖片的時間為36t,對於384x384的圖片,耗時同樣為6*6*t = 36t,假設下一層為池化層,每次2x2池化的時間為ti,對於36張224x224的圖片,總耗時36*112*112*ti = 451584ti,對於384x384的圖片,耗時為192*192*ti = 36864ti << 451584ti,類似進行計算下去,發現全卷積每一層的耗時都少的多。因此全卷積效率更高,直觀上如何得到這個結論呢?將384x384的圖片按照32的步長切成224x224後得到36張圖片,這36張圖片有很多區域重疊了,本來一次池化就可以得到結果的,但是輸入36張圖片後,相同區域進行了多次重複池化操作,因此耗費了更多的時間。