谷歌 Inception 網絡簡介( Inception network motivation)
構建卷積層時,你要決定過濾器的大小究竟是 1×1, 3×3 還是 5×5,或者要不要添加池化層。而 Inception 網絡的作用就是代替你來決定,雖然網絡架構因此變得更加復雜,但網絡表現卻非常好。
例如,這是你 28×28×192 維度的輸入層, Inception 網絡或 Inception 層的作用就是代替人工來確定卷積層中的過濾器類型,或者確定是否需要創建卷積層或池化層:
如果使用 1×1 卷積,輸出結果會是 28×28×#(某個值),假設輸出為 28×28×64,並且這里只有一個層
如果使用 3×3 的過濾器,那么輸出是 28×28×128。然后我們把第二個值堆積到第一個值上,為了匹配維度,我們應用 same 卷積,輸出維度依然是 28×28,和輸入維度相同,即高度和寬度相同。
如果用 5×5 過濾器或許會更好,輸出變成 28×28×32,我們再次使用 same 卷積,保持維度不變。
或許你不想要卷積層,那就用池化操作,得到一些不同的輸出結果,我們把它也堆積起來,這里的池化輸出是 28×28×32。為了匹配所有維度,我們需要對最大池化使用 padding,它是一種特殊的池化形式,因為如果輸入的高度和寬度為 28×28,則輸出的相應維度也是
28×28。然后再進行池化, padding 不變,步幅為 1。
有了這樣的 Inception 模塊,你就可以輸入某個量,因為它累加了所有數字,這里的最終輸出為 32+32+128+64=256。 Inception 模塊的輸入為 28×28×192,輸出為 28×28×256。這就是 Inception 網絡的核心內容。
基本思想是 Inception 網絡不需要人為決定使用哪個過濾器或者是否需要池化,而是由網絡自行確定這些參數,你可以給網絡添加這些參數的所有可能值,然后把這些輸出連接起來,讓網絡自己學習它需要什么樣的參數,采用哪些過濾器組合。
但是,Inception 層有一個問題,就是計算成本比較高:
這是一個 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 億次乘法運算,成本也是相當高的。
這里還有另外一種架構,其輸入為 28×28×192,輸出為 28×28×32。其結果是這樣的,對於輸入層,使用 1×1 卷積把輸入值從 192 個通道減少到 16 個通道。然后對這個較小層運行5×5 卷積,得到最終輸出。請注意,輸入和輸出的維度依然相同,輸入是 28×28×192,輸出是 28×28×32。
應用 1×1 卷積,過濾器個數為 16,每個過濾器大小為×1×192,這兩個維度相匹配(輸入通道數與過濾器通道數), 28×28×16 這個層的計算成本是,輸出 28×28×192 中每個元素都做 192 次乘法,用 1×1×192 來表示,相乘結果約等於 240萬。
萬。240 萬只是第一個卷積層的計算成本,第二個卷積層的計算成本。輸出28×28×32,對每個輸出值應用一個 5×5×16 維度的過濾器,計算結果為 1000 萬。所以所需要乘法運算的總次數是這兩層的計算成本之和,也就是 1204 萬。計算成本從 1.2 億下降到了原來的十分之一。所需要的加法運算與乘法運算的次數近似相等,所以我只統計了乘法運算的次數。
如果你在構建神經網絡層的時候,不想決定池化層是使用 1×1, 3×3 還是 5×5的過濾器,那么 Inception 模塊就是最好的選擇。我們可以應用各種類型的過濾器,只需要把輸出連接起來。