從VGG到NASNet,一文概覽圖像分類網路
來自專欄機器之心
選自towardsdatascience,作者:Lars Hulstaert,機器之心編譯
了解圖像分類的不同網路架構是一項非常艱巨的任務。本文將討論目前可在 keras 上使用的主要架構。作者將按照這些架構出現的時間順序對其逐一講解,並嘗試以從業者的角度討論其優缺點。
關鍵概念
雖然計算機視覺研究者們採取的方法各不相同,但是大體而言,他們的實驗設置有著如下的趨勢。本文將討論如何進行圖像預處理,數據增強用於哪類數據,優化機制以及輸出層的實現方法。
預處理
通常而言,我們會計算訓練集圖像的平均像素值,將其從圖像中減去。請注意,在 keras 環境下使用這些模型時考慮預處理方法很重要。計算機視覺模型不同,Keras 的「預處理」也不同。
數據增強
圖像分類的數據集非常大。儘管如此,依然需要數據增強來提高模型泛化能力。數據增強一般包括重新縮放圖像的隨機裁剪、隨機水平翻轉、隨機 RGB 顏色與亮度變換等技術。此外,也存在不同的縮放、裁剪等技術(即單尺度訓練 vs 多尺度訓練)。在測試階段進行多裁剪評估也是經常使用的途徑,不過該方案的計算成本更昂貴且性能改進有限。請注意,隨機縮放和裁剪的目標是在不同尺寸和位置上學習對象的重要特徵。Keras 並未實現所有數據增強技術的開箱即用,但可以通過 ImageDataGenerator 模塊的預處理技術輕鬆實現。Andrew Howard 提出的數據增強技術更深入地解釋了這些關鍵性的方法,具體參見:
https://arxiv.org/ftp/arxiv/papers/1312/1312.5402.pdf
訓練機制
在 keras 中可通過多 GPU 數據並行化訓練模型(一般批大小為 256)。動量 SGD 或 RMSProp 是常用的優化技術。學習率的方案相對簡單,要麼在驗證集的損失或準確率開始穩定時調低學習率,要麼在固定間隔上調低學習率。通過 keras 中的「ReduceLROnPlateau」回調函數可以輕鬆模擬這種行為。
最後一層
圖像分類網路中最後一層傳統上來說是全連接層。這些層的參數量巨大,因為你需要 N×M 個參數才能從 N 個隱藏節點過渡到 M 個節點。現在,這些全連接層已經被平均池化或最大池化層替代,它們要求的參數量和計算時間比較小。在對 keras 中預先訓練好的網路進行微調時,這一點非常重要,這能限制所需要添加參數的數量。
VGGNet
VGGNet(https://arxiv.org/pdf/1409.1556.pdf)發佈於 2014 年,作者是 Karen Simonyan 和 Andrew Zisserman,該網路表明堆疊多個層是提升計算機視覺性能的關鍵因素。VGGNet 包含 16 或 19 層,主要由小型的 3×3 卷積操作和 2×2 池化操作組成。
VGG 的優點在於,堆疊多個小的卷積核而不使用池化操作可以增加網路的表徵深度,同時限制參數的數量。例如,通過堆疊 3 個 3×3 卷積層而不是使用單個的 7×7 層,可以克服一些限制。首先,這樣做組合了三個非線性函數,而不只是一個,使得決策函數更有判別力和表徵能力。第二,參數量減少了 81%,而感受野保持不變。另外,小卷積核的使用也扮演了正則化器的角色,並提高了不同卷積核的有效性。
VGG 的缺點在於,其評估的開銷比淺層網路更加昂貴,內存和參數(140M)也更多。這些參數的大部分都可以歸因於第一個全連接層。結果表明,這些層可以在不降低性能的情況下移除,同時顯著減少了必要參數的數量。16 層和 19 層的參數預訓練 VGG 在 keras 上是可以使用的。
ResNet
ResNet 架構是由何凱明等人提出的,他們試圖通過這個架構訓練更深的網路。作者指出,增加網路深度會導致更高的訓練誤差,這表明梯度問題(梯度消失/爆炸)可能會導致訓練收斂性等潛在問題。
ResNet 的主要貢獻是增加了神經網路架構的跳過連接(skip connection),使用批歸一化並移除了作為最後一層的全連接層。
跳過連接基於這樣一種想法:只要神經網路模型能夠「適當地」將信息從前一層傳遞到下一層,它應該能變得「無限」深。如果在更深層沒有附加信息進行聚合,那麼帶有跳過連接的卷積層可以視為一個恆等映射函數。
通過向網路中添加跳過連接,卷積層的默認函數變成了恆等函數。卷積核學到的任何新信息都可以在基本表徵中添加或減去,因此這更容易優化殘差映射。跳過連接不會增加參數的數量,但可以獲得更穩定的訓練和顯著的性能提升,這是因為可以達到更深的網路(例如深度為 34、50、101 和 152 的網路)。請注意,1×1 的卷積用於減少輸出通道的個數。
除跳過連接之外,在每次卷積完成後、激活進行前都採取批歸一化。最後,網路刪除了全連接層,並使用平均池化層減少參數的數量。由於網路加深,卷積層的抽象能力更強,從而減少了對全連接層的需求。
GoogLeNet
GoogLeNet 與 ResNet 的論文幾乎同時發表,但它們引入了不同的改進方案。前面提到的兩篇論文著重於提高分類網路的表徵深度。
然而,GoogLeNet 仍試圖擴大網路(多達 22 層),但也希望減少參數量和計算量。最初的 Inception 架構由 Google 發布,重點將 CNN 應用於大數據場景以及移動端。GoogLeNet 是包含 Inception 模塊的全卷積結構。這些模塊的目的是:通過構建由多個子模塊(比如嵌套網路 - Inception)組成的複雜卷積核來提高卷積核的學習能力和抽象能力。
除了加入 Inception 模塊,作者還使用了輔助分類器來提高穩定性和收斂速度。輔助分類器的想法是使用幾個不同層的圖像表徵來執行分類任務(黃色框)。因此,模型中的不同層都可以計算梯度,然後使用這些梯度來優化訓練。
Inception v3
Inception v3 架構中結合了幾項創新點。在 Inception v3 中,主要的創新在於借鑒了 GoogLeNet 和 VGGNet 的部分原創思想,即使用 Inception 模塊並通過一系列較小的卷積核更高效地表示較大的卷積核。除了小卷積之外,作者還嘗試了非對稱卷積(例如用 n×1 和 1×n 代替 n×n,而非多個 2×2 和 3×3 濾波器)。
作者通過執行批歸一化和標籤平滑化來改進正則化。標籤平滑就是為每個類都分配一些權重,而不是將全權重分配給 ground truth 標籤。由於網路對訓練標籤的過擬合程度較低,因此它應該能夠更好地泛化,這與使用 L2 正則化效果相仿。
為了確保該模型在高解析度圖像和低解析度圖像上均表現良好,作者通過 Inception 模塊分析了不同尺寸下的圖像表徵。因此,當 Inception 網路用於目標檢測框架時,它們在對小解析度和低解析度對象進行分類時表現良好。
NASNet
我要討論的最後一個圖像分類架構是 NASNet(https://arxiv.org/pdf/1707.07012.pdf),它是使用神經結構搜索(NAS)框架構建的。NASNet 的目標是運用數據驅動和智能方法,而非直覺和實驗來構建網路架構。儘管我不會詳細討論這個框架,但是可以解釋一下它的總體思路。
Inception 論文表明「神經網路單元」中複雜的卷積核組合單元可以顯著提升結果。NAS 框架將這種單元的構建過程定義為優化過程,然後通過疊加最佳單元來構建大型網路。
原文鏈接:https://towardsdatascience.com/an-overview-of-image-classification-networks-3fb4ff6fa61b
推薦閱讀:
※數字圖像處理
※數字圖像處理入門學習筆記(綜述)
※Atom_Catcher 一個針對原子分辨電子顯微圖像的項目
※OpenCV圖像處理之傅里葉變換(1)
※OTSU閾值分割