吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

谷歌 Inception 網絡簡介(Inception network motivation)

構建卷積層時,你要決定過濾器的大小究竟是1×1,3×3還是5×5,或者要不要添加池化層。而Inception網絡的作用就是代替你來決定,雖然網絡架構因此變得更加複雜,但網絡表現卻非常好,我們來了解一下其中的原理。

例如,這是你28×28×192維度的輸入層,Inception網絡或Inception層的作用就是代替人工來確定卷積層中的過濾器類型,或者確定是否需要創建卷積層或池化層,我們演示一下。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

如果使用1×1卷積,輸出結果會是28×28×#(某個值),假設輸出為28×28×64,並且這裡只有一個層。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

如果使用3×3的過濾器,那麼輸出是28×28×128。然後我們把第二個值堆積到第一個值上,為了匹配維度,我們應用same卷積,輸出維度依然是28×28,和輸入維度相同,即高度和寬度相同。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

或許你會說,我希望提升網絡的表現,用5×5過濾器或許會更好,我們不妨試一下,輸出變成28×28×32,我們再次使用same卷積,保持維度不變。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

或許你不想要卷積層,那就用池化操作,得到一些不同的輸出結果,我們把它也堆積起來,這裡的池化輸出是28×28×32。為了匹配所有維度,我們需要對最大池化使用padding,它是一種特殊的池化形式,因為如果輸入的高度和寬度為28×28,則輸出的相應維度也是28×28。然後再進行池化,padding不變,步幅為1。

這個操作非常有意思,但我們要繼續學習後面的內容,一會再實現這個池化過程。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

有了這樣的Inception模塊,你就可以輸入某個量,因為它累加了所有數字,這裡的最終輸出為32+32+128+64=256。

Inception模塊的輸入為28×28×192,輸出為28×28×256。這就是Inception網絡的核心內容,提出者包括Christian Szegedy、劉偉、賈揚清、Pierre Sermanet、Scott Reed、Dragomir Anguelov、Dumitru Erhan、Vincent Vanhoucke和Andrew Rabinovich。

基本思想是Inception網絡不需要人為決定使用哪個過濾器或者是否需要池化,而是由網絡自行確定這些參數,你可以給網絡添加這些參數的所有可能值,然後把這些輸出連接起來,讓網絡自己學習它需要什麼樣的參數,採用哪些過濾器組合。

不難發現,我所描述的Inception層有一個問題,就是計算成本,下一張幻燈片,我們就來計算這個5×5過濾器在該模塊中的計算成本。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

我們把重點集中在前一張幻燈片中的5×5的過濾器,這是一個28×28×192的輸入塊,執行一個5×5卷積,它有32個過濾器,輸出為28×28×32。

前一張幻燈片中,我用一個紫色的細長塊表示,這裡我用一個看起來更普通的藍色塊表示。我們來計算這個28×28×32輸出的計算成本,它有32個過濾器,因為輸出有32個通道,每個過濾器大小為5×5×192,輸出大小為28×28×32,所以你要計算28×28×32個數字。

對於輸出中的每個數字來說,你都需要執行5×5×192次乘法運算,所以乘法運算的總次數為每個輸出值所需要執行的乘法運算次數(5×5×192)乘以輸出值個數(28×28×32),把這些數相乘結果等於1.2億(120422400)。即使在現在,用計算機執行1.2億次乘法運算,成本也是相當高的。下一圖會介紹1×1卷積的應用,也就是我們上節課所學的。為了降低計算成本,我們用計算成本除以因子10,結果它從1.2億減小到原來的十分之一。請記住120這個數字,一會還要和下一頁看到的數字做對比。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

這裡還有另外一種架構,其輸入為28×28×192,輸出為28×28×32。

其結果是這樣的,對於輸入層,使用1×1卷積把輸入值從192個通道減少到16個通道。然後對這個較小層運行5×5卷積,得到最終輸出。請注意,輸入和輸出的維度依然相同,輸入是28×28×192,輸出是28×28×32,和上一頁的相同。但我們要做的就是把左邊這個大的輸入層壓縮成這個較小的的中間層,它只有16個通道,而不是192個。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

有時候這被稱為瓶頸層(bottleneck),瓶頸通常是某個對象最小的部分,假如你有這樣一個玻璃瓶,這是瓶塞位置,瓶頸就是這個瓶子最小的部分。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

同理,瓶頸層也是網絡中最小的部分,我們先縮小網絡表示,然後再擴大它。

接下來我們看看這個計算成本,應用1×1卷積,過濾器個數為16,每個過濾器大小為1×1×192,這兩個維度相匹配(輸入通道數與過濾器通道數),28×28×16這個層的計算成本是,輸出28×28×192中每個元素都做192次乘法,用1×1×192來表示,相乘結果約等於240萬。

吳恩達深度學習筆記(87)-谷歌 Inception 網絡簡介Inception(1)

那第二個卷積層呢?240萬隻是第一個卷積層的計算成本,第二個卷積層的計算成本又是多少呢?這是它的輸出,28×28×32,對每個輸出值應用一個5×5×16維度的過濾器,計算結果為1000萬。

所以所需要乘法運算的總次數是這兩層的計算成本之和,也就是1204萬,與上一圖中的值做比較,計算成本從1.2億下降到了原來的十分之一,即1204萬。所需要的加法運算與乘法運算的次數近似相等,所以我只統計了乘法運算的次數。

總結一下,如果你在構建神經網絡層的時候,不想決定池化層是使用1×1,3×3還是5×5的過濾器,那麼Inception模塊就是最好的選擇。我們可以應用各種類型的過濾器,只需要把輸出連接起來。之後我們講到計算成本問題,我們學習瞭如何通過使用1×1卷積來構建瓶頸層,從而大大降低計算成本。

你可能會問,僅僅大幅縮小表示層規模會不會影響神經網絡的性能?

事實證明,只要合理構建瓶頸層,你既可以顯著縮小表示層規模,又不會降低網絡性能,從而節省了計算。

這就是Inception模塊的主要思想,我們在這總結一下。下個筆記,我們將演示一個完整的Inception網絡。


分享到:


相關文章: