本文簡要介紹了 Inception 家族的主要成員,包括 Inception v1、Inception v2 和 Inception v3、Inception v4 和 Inception-ResNet。它們的計算效率與引數效率在所有卷積架構中都是頂尖的,且根據 CS231n 中所介紹的,Inception V4 基本上是當前在 ImageNet 影像分類任務 Top-1 正確率最高的模型。
Inception 網路是 CNN 分類器發展史上一個重要的里程碑。在 Inception 出現之前,大部分流行 CNN 僅僅是把卷積層堆疊得越來越多,使網路越來越深,以此希望能夠得到更好的效能。
例如第一個得到廣泛關注的 AlexNet,它本質上就是擴充套件 LeNet 的深度,並應用一些 ReLU、Dropout 等技巧。AlexNet 有 5 個卷積層和 3 個最大池化層,它可分為上下兩個完全相同的分支,這兩個分支在第三個卷積層和全連線層上可以相互交換資訊。與 Inception 同年提出的優秀網路還有 VGG-Net,它相比於 AlexNet 有更小的卷積核和更深的層級。
VGG-Net 的泛化效能非常好,常用於影像特徵的抽取目標檢測候選框生成等。VGG 最大的問題就在於引數數量,VGG-19 基本上是引數量最多的卷積網路架構。這一問題也是第一次提出 Inception 結構的 GoogLeNet 所重點關注的,它沒有如同 VGG-Net 那樣大量使用全連線網路,因此引數量非常小。
GoogLeNet 最大的特點就是使用了 Inception 模組,它的目的是設計一種具有優良區域性拓撲結構的網路,即對輸入影像並行地執行多個卷積運算或池化操作,並將所有輸出結果拼接為一個非常深的特徵圖。因為 1*1、3*3 或 5*5 等不同的卷積運算與池化操作可以獲得輸入影像的不同資訊,並行處理這些運算並結合所有結果將獲得更好的影像表徵。
另一方面,Inception 網路是複雜的(需要大量工程工作)。它使用大量 trick 來提升效能,包括速度和準確率兩方面。它的不斷進化帶來了多種 Inception 網路版本的出現。常見的版本有:
Inception v1
Inception v2 和 Inception v3
Inception v4 和 Inception-ResNet
每個版本都是前一個版本的迭代進化。瞭解 Inception 網路的升級可以幫助我們構建自定義分類器,最佳化速度和準確率。此外,根據你的已有資料,或許較低版本工作效果更好。
Inception v1
這是 Inception 網路的第一個版本。我們來分析一下它可以解決什麼問題,以及如何解決。
在《Going deeper with convolutions》論文中,作者提出一種深度卷積神經網路 Inception,它在 ILSVRC14 中達到了當時最好的分類和檢測效能。該架構的主要特點是更好地利用網路內部的計算資源,這透過一個精心製作的設計來實現,該設計允許增加網路的深度和寬度,同時保持計算預算不變。為了最佳化質量,架構決策基於赫布原則和多尺度處理。作者向 ILSVRC14 提交使用該架構的模型即 GoogLeNet,這是一個 22 層的深度網路,它的質量是在分類和檢測領域進行了評估。
論文:Going deeper with convolutions
論文連結:https://arxiv.org/pdf/1409.4842v1.pdf
問題:
影像中突出部分的大小差別很大。例如,狗的影像可以是以下任意情況。每張影像中狗所佔區域都是不同的。
從左到右:狗佔據影像的區域依次減小(圖源:https://unsplash.com/)。
由於資訊位置的巨大差異,為卷積操作選擇合適的卷積核大小就比較困難。資訊分佈更全域性性的影像偏好較大的卷積核,資訊分佈比較區域性的影像偏好較小的卷積核。
非常深的網路更容易過擬合。將梯度更新傳輸到整個網路是很困難的。
簡單地堆疊較大的卷積層非常消耗計算資源。
解決方案:
為什麼不在同一層級上執行具備多個尺寸的濾波器呢?網路本質上會變得稍微「寬一些」,而不是「更深」。作者因此設計了 Inception 模組。
下圖是「原始」Inception 模組。它使用 3 個不同大小的濾波器(1x1、3x3、5x5)對輸入執行卷積操作,此外它還會執行最大池化。所有子層的輸出最後會被級聯起來,並傳送至下一個 Inception 模組。
原始 Inception 模組。(圖源:https://arxiv.org/pdf/1409.4842v1.pdf)
如前所述,深度神經網路需要耗費大量計算資源。為了降低算力成本,作者在 3x3 和 5x5 卷積層之前新增額外的 1x1 卷積層,來限制輸入通道的數量。儘管新增額外的卷積操作似乎是反直覺的,但是 1x1 卷積比 5x5 卷積要廉價很多,而且輸入通道數量減少也有利於降低算力成本。不過一定要注意,1x1 卷積是在最大池化層之後,而不是之前。
實現降維的 Inception 模組。(圖源:https://arxiv.org/pdf/1409.4842v1.pdf)
利用實現降維的 Inception 模組可以構建 GoogLeNet(Inception v1),其架構如下圖所示:
GoogLeNet。橙色框是 stem,包含一些初始卷積。紫色框是輔助分類器。較寬的部分是 inception 模組。(圖源:https://arxiv.org/pdf/1409.4842v1.pdf)
GoogLeNet 有 9 個線性堆疊的 Inception 模組。它有 22 層(包括池化層的話是 27 層)。該模型在最後一個 inception 模組處使用全域性平均池化。
不用多說,這是一個深層分類器。和所有深層網路一樣,它也會遇到梯度消失問題。
為了阻止該網路中間部分梯度的「消失」過程,作者引入了兩個輔助分類器(上圖紫色框)。它們對其中兩個 Inception 模組的輸出執行 softmax 操作,然後在同樣的標籤上計算輔助損失。總損失即輔助損失和真實損失的加權和。該論文中對每個輔助損失使用的權重值是 0.3。
# The total loss used by the inception net during training.
total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2
輔助損失只是用於訓練,在推斷過程中並不使用。
Inception v2
Inception v2 和 Inception v3 來自同一篇論文《Rethinking the Inception Architecture for Computer Vision》,作者提出了一系列能增加準確度和減少計算複雜度的修正方法。
在這一篇論文中,作者表示非常深的卷積網路自 2014 年以來就成為了計算機視覺領域的主流,它在各種基準測試中都獲得了非常多的提升。只要有足夠的標註資料,增加模型大小與計算成本可以在大多數任務中快速提升模型質量。在這篇論文中,作者積極探索擴充套件網路的方法,旨在透過適當的分解卷積與積極的正則化儘可能高效地利用新增的計算。他們在 ILSVRC 2012 分類任務挑戰賽的驗證集上證明了模型的優秀效能,使用每個推斷過程有 50 億次乘加運算的模型,作者實現了單幀評估 21.2% top-1 和 5.6% top-5 誤差率,且模型的總引數還不到 250 萬。
論文:Rethinking the Inception Architecture for Computer Vision
論文地址:https://arxiv.org/pdf/1512.00567v3.pdf
以下首先介紹 Inception V2。
問題:
減少特徵的表徵性瓶頸。直觀上來說,當卷積不會大幅度改變輸入維度時,神經網路可能會執行地更好。過多地減少維度可能會造成資訊的損失,這也稱為「表徵性瓶頸」。
使用更優秀的因子分解方法,卷積才能在計算複雜度上更加高效。
解決方案:
將 5×5 的卷積分解為兩個 3×3 的卷積運算以提升計算速度。儘管這有點違反直覺,但一個 5×5 的卷積在計算成本上是一個 3×3 卷積的 2.78 倍。所以疊加兩個 3×3 卷積實際上在效能上會有所提升,如下圖所示:
最左側前一版 Inception 模組中的 5×5 卷積變成了兩個 3×3 卷積的堆疊。(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)
此外,作者將 n*n 的卷積核尺寸分解為 1×n 和 n×1 兩個卷積。例如,一個 3×3 的卷積等價於首先執行一個 1×3 的卷積再執行一個 3×1 的卷積。他們還發現這種方法在成本上要比單個 3×3 的卷積降低 33%,這一結構如下圖所示:
此處如果 n=3,則與上一張影像一致。最左側的 5x5 卷積可被表示為兩個 3x3 卷積,它們又可以被表示為 1x3 和 3x1 卷積。(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)
模組中的濾波器組被擴充套件(即變得更寬而不是更深),以解決表徵性瓶頸。如果該模組沒有被擴充寬度,而是變得更深,那麼維度會過多減少,造成資訊損失。如下圖所示:
使 Inception 模組變得更寬。這種型別等同於前面展示的模組(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)
前面三個原則用來構建三種不同型別的 Inception 模組(這裡我們按引入順序稱之為模組 A、B、C,這裡使用「A、B、C」作為名稱只是為了清晰期間,並不是它們的正式名稱)。架構如下所示:
這裡,「figure 5」是模組 A,「figure 6」是模組 B,「figure 7」是模組 C。(圖源:https://arxiv.org/pdf/1512.00567v3.pdf)
Inception v3
問題:
作者注意到輔助分類器直到訓練過程快結束時才有較多貢獻,那時準確率接近飽和。作者認為輔助分類器的功能是正則化,尤其是它們具備 BatchNorm 或 Dropout 操作時。
是否能夠改進 Inception v2 而無需大幅更改模組仍需要調查。
解決方案:
Inception Net v3 整合了前面 Inception v2 中提到的所有升級,還使用了:
RMSProp 最佳化器;
Factorized 7x7 卷積;
輔助分類器使用了 BatchNorm;
標籤平滑(新增到損失公式的一種正則化項,旨在阻止網路對某一類別過分自信,即阻止過擬合)。
Inception v4
Inception v4 和 Inception -ResNet 在同一篇論文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介紹。為清晰起見,我們分成兩個部分來介紹。
在該論文中,研究者介紹道,Inception 架構可以用很低的計算成本達到很高的效能。而在傳統的網路架構中引入殘差連線曾在 2015ILSVRC 挑戰賽中獲得當前最佳結果,其結果和 Inception-v3 網路當時的最新版本相近。這使得人們好奇,如果將 Inception 架構和殘差連線結合起來會是什麼效果。在這篇論文中,研究者透過實驗明確地證實了,結合殘差連線可以顯著加速 Inception 的訓練。也有一些證據表明殘差 Inception 網路在相近的成本下略微超過沒有殘差連線的 Inception 網路。研究者還展示了多種新型殘差和非殘差 Inception 網路的簡化架構。這些變體顯著提高了在 ILSVRC2012 分類任務挑戰賽上的單幀識別效能。作者進一步展示了適當的啟用值縮放如何穩定非常寬的殘差 Inception 網路的訓練過程。透過三個殘差和一個 Inception v4 的模型整合,作者在 ImageNet 分類挑戰賽的測試集上取得了 3.08% 的 top-5 誤差率。
論文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
論文地址:https://arxiv.org/pdf/1602.07261.pdf
問題:
使模組更加一致。作者還注意到某些模組有不必要的複雜性。這允許我們透過新增更多一致的模組來提高效能。
解決方案:
Inception v4 的 stem 被修改了。這裡的 stem 參考了在引入 Inception 塊之前執行的初始運算集。
圖上部是 Inception-ResNet v1 的 stem。圖下部是 Inception v4 和 Inception-ResNet v2 的 stem。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
它們有三個主要的 Inception 模組,稱為 A、B 和 C(和 Inception v2 不同,這些模組確實被命名為 A、B 和 C)。它們看起來和 Inception v2(或 v3)變體非常相似。
(左起)在 Inception v4 中使用的 Inception 模組 A、B、C。注意它們和 Inception v2(或 v3)模組的相似性。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
Inception v4 引入了專用的「縮減塊」(reduction block),它被用於改變網格的寬度和高度。早期的版本並沒有明確使用縮減塊,但也實現了其功能。
縮減塊 A(從 35x35 到 17x17 的尺寸縮減)和縮減塊 B(從 17x17 到 8x8 的尺寸縮減)。這裡參考了論文中的相同超引數設定(V,I,k)。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
Inception-ResNet v1 和 v2
受 ResNet 的優越效能啟發,研究者提出了一種混合 inception 模組。Inception ResNet 有兩個子版本:v1 和 v2。在我們分析其顯著特徵之前,先看看這兩個子版本之間的微小差異。
Inception-ResNet v1 的計算成本和 Inception v3 的接近。
Inception-ResNetv2 的計算成本和 Inception v4 的接近。
它們有不同的 stem,正如 Inception v4 部分所展示的。
兩個子版本都有相同的模組 A、B、C 和縮減塊結構。唯一的不同在於超引數設定。在這一部分,我們將聚焦於結構,並參考論文中的相同超引數設定(影像是關於 Inception-ResNet v1 的)。
問題:
引入殘差連線,它將 inception 模組的卷積運算輸出新增到輸入上。
解決方案:
為了使殘差加運算可行,卷積之後的輸入和輸出必須有相同的維度。因此,我們在初始卷積之後使用 1x1 卷積來匹配深度(深度在卷積之後會增加)。
(左起)Inception ResNet 中的 Inception 模組 A、B、C。注意池化層被殘差連線所替代,並在殘差加運算之前有額外的 1x1 卷積。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
主要 inception 模組的池化運算由殘差連線替代。然而,你仍然可以在縮減塊中找到這些運算。縮減塊 A 和 Inception v4 中的縮減塊相同。
(左起)縮減塊 A(從 35x35 到 17x17 的尺寸縮減)和縮減塊 B(從 17x17 到 8x8 的尺寸縮減)。這裡參考了論文中的相同超引數設定(V,I,K)。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
如果卷積核的數量超過 1000,則網路架構更深層的殘差單元將導致網路崩潰。因此,為了增加穩定性,作者透過 0.1 到 0.3 的比例縮放殘差啟用值。
啟用值透過一個常數進行比例縮放,以防止網路崩潰。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
原始論文並沒有在求和之後使用批歸一化,以在單個 GPU 上訓練模型(在單個 GPU 上擬合整個模型)。
研究發現 Inception-ResNet 模型可以在更少的 epoch 內達到更高的準確率。
Inception v4 和 Inception-ResNet 的網路完整架構如下圖所示:
圖上部是 Inception v4 的架構。圖下部是 Inception-ResNet 的架構。(圖源:https://arxiv.org/pdf/1602.07261.pdf)
原文地址:https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202