理解為什么要將全連接層轉化為卷積層


理解為什么要將全連接層轉化為卷積層

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張圖片后,相同區域進行了多次重復池化操作,因此耗費了更多的時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM