摘要:了解圖像分類的不同網絡架構是一項非常艱鉅的任務。 本文將討論目前可在keras上使用的主要架構。 作者將按照這些架構出現的時間順序對其逐一講解,並嘗試以從業者的角度討論其優缺點。 關鍵概念雖然計算機視覺研究
了解圖像分類的不同網絡架構是一項非常艱鉅的任務。 本文將討論目前可在 keras 上使用的主要架構。 作者將按照這些架構出現的時間順序對其逐一講解,並嘗試以從業者的角度討論其優缺點。
關鍵概念
雖然計算機視覺研究者們採取的方法各不相同,但是大體而言,他們的實驗設置有著如下的趨勢。 本文將討論如何進行圖像預處理,數據增強用於哪類數據,優化機制以及輸出層的實現方法。
預處理
通常而言,我們會計算訓練集圖像的平均像素值,將其從圖像中減去。 請注意,在 keras 環境下使用這些模型時考慮預處理方法很重要。 計算機視覺模型不同,Keras 的「預處理」也不同。
數據增強
圖像分類的數據集非常大。 儘管如此,依然需要數據增強來提高模型泛化能力。 數據增強一般包括重新縮放圖像的隨機裁剪、隨機水平翻轉、隨機
RGB 顏色與亮度變換等技術。 此外,也存在不同的縮放、裁剪等技術(即單尺度訓練 vs
多尺度訓練)。 在測試階段進行多裁剪評估也是經常使用的途徑,不過該方案的計算成本更昂貴且性能改進有限。 請注意,隨機縮放和裁剪的目標是在不同尺寸和位置上學習對象的重要特徵。 Keras
並未實現所有數據增強技術的開箱即用,但可以通過 ImageDataGenerator 模塊的預處理技術輕鬆實現。 Andrew Howard
提出的數據增強技術更深入地解釋了這些關鍵性的方法,具體參見:
https://arxiv.org/ftp/arxiv/papers/1312/1312.5402.pdf
同一照片不同裁剪方式的實例(選自 Andrew Howard 論文)
訓練機制
在
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 架構是由何凱明等人提出的,他們試圖通過這個架構訓練更深的網絡。 作者指出,增加網絡深度會導致更高的訓練誤差,這表明梯度問題(梯度消失/爆炸)可能會導致訓練收斂性等潛在問題。
儘管 20 層網絡的潛在函數空間是封裝在 56 層網絡的空間內且運用了傳統的梯度下降,但無法實現同樣的效果(選自 ResNet 論文)
ResNet 的主要貢獻是增加了神經網絡架構的跳過連接(skip connection),使用批歸一化並移除了作為最後一層的全連接層。
通過跳過連接,卷積層的輸入 x 被添加到輸出當中。 因此,網絡只學習「殘留」特徵,並容易保存已學習的特徵。
跳過連接基於這樣一種想法:只要神經網絡模型能夠「適當地」將信息從前一層傳遞到下一層,它應該能變得「無限」深。 如果在更深層沒有附加信息進行聚合,那麼帶有跳過連接的捲積層可以視為一個恆等映射函數。
通過向網絡中添加跳過連接,卷積層的默認函數變成了恆等函數。 卷積核學到的任何新信息都可以在基本表徵中添加或減去,因此這更容易優化殘差映射。 跳過連接不會增加參數的數量,但可以獲得更穩定的訓練和顯著的性能提升,這是因為可以達到更深的網絡(例如深度為
34、50、101 和 152 的網絡)。 請注意,1×1 的捲積用於減少輸出通道的個數。
除跳過連接之外,在每次卷積完成後、激活進行前都採取批歸一化。 最後,網絡刪除了全連接層,並使用平均池化層減少參數的數量。 由於網絡加深,卷積層的抽象能力更強,從而減少了對全連接層的需求。
GoogLeNet
GoogLeNet 與 ResNet 的論文幾乎同時發表,但它們引入了不同的改進方案。 前面提到的兩篇論文著重於提高分類網絡的表徵深度。
然而,GoogLeNet
仍試圖擴大網絡(多達 22 層),但也希望減少參數量和計算量。 最初的 Inception 架構由 Google 發布,重點將 CNN
應用於大數據場景以及移動端。 GoogLeNet 是包含 Inception
模塊的全卷積結構。 這些模塊的目的是:通過構建由多個子模塊(比如嵌套網絡 –
Inception)組成的複雜卷積核來提高卷積核的學習能力和抽象能力。
Inception 模塊的實例。 1×1 卷積用來減小輸入/輸出的維度(選自 GoogLeNet 論文)。
除了加入 Inception 模塊,作者還使用了輔助分類器來提高穩定性和收斂速度。 輔助分類器的想法是使用幾個不同層的圖像表徵來執行分類任務(黃色框)。 因此,模型中的不同層都可以計算梯度,然後使用這些梯度來優化訓練。
GoogLeNet 架構圖示。 黃色框表示輔助分類器(選自GoogLeNet論文)。
Inception v3
Inception
v3 架構中結合了幾項創新點。 在 Inception v3 中,主要的創新在於借鑒了 GoogLeNet 和 VGGNet
的部分原創思想,即使用 Inception 模塊並通過一系列較小的捲積核更高效地表示較大的捲積核。 除了小卷積之外,作者還嘗試了非對稱卷積(例如用
n×1 和 1×n 代替 n×n,而非多個 2×2 和 3×3 濾波器)。
一個 3×3 卷積核後跟一個 1×1 卷積核的例子,它有效地取代了一個 5×5 卷積核(圖片來自 Inception v3 論文)。
作者通過執行批歸一化和標籤平滑化來改進正則化。 標籤平滑就是為每個類都分配一些權重,而不是將全權重分配給 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
版權聲明
本文僅代表作者觀點,不代表百度立場。
本文係作者授權百度百家發表,未經許可,不得轉載。