DenseNet Models for Tiny ImageNet Classification(翻譯)

PS:個人學習記錄;有問題請留言,看到會回覆!謝謝!


原文地址:https://arxiv.org/pdf/1904.10429

 :本文提出了兩種基於微型ImageNet數據集的圖像分類模型。我們基於密接卷積網絡的思想從無到有地建立了兩個截然不同的網絡。根據該數據集的圖像分辨率,通過計算卷積層的接收場,設計了網絡結構。我們還使用了一些與圖像增強和循環學習率相關的非常規技術來提高模型的準確性。該網絡在高約束和低計算資源下訓練。我們的目標是達到60%的前1驗證精度,並給出了結果和誤差分析。

1. 引言

圖像分類競賽有很多,如ImageNet大規模視覺識別挑戰賽(ILSVRC),其中提出了幾種卷積神經網絡結構和模型。2015年,ResNet模型以152層贏得了ImageNet[1]挑戰,獲得了3.57%的Top 5分類誤差[2]。在本文中,我們提出了一種爲ImageNet數據集的子集(稱爲Tiny ImageNet)建立分類模型的方法。我們沒有使用任何可用於原始ImageNet挑戰的預訓練網絡。相反,我們從頭開始構建了兩個不同的模型,從DenseNet架構中獲得靈感[3]。我們的目標是達到60%的驗證精度與這些自定義模型在幾個限制和有限的資源。我們最大的挑戰是Google Colab[5]免費服務提供的低計算能力。Google Colab只提供12小時的連續計算時間,之後需要重新連接會話。此外,我們還限制了我們的模型使用任何密集或完全連接的層、任何丟失層、1x1濾波器來增加通道數和超過500個訓練批次。爲了提高精度和減少計算時間,我們使用了一些針對這一挑戰的創新技術。

2. 數據集

微型ImageNet數據集[4]是原始ImageNet數據集[1]的修改子集。這裏,有200個不同的類,而不是1000個類的ImageNet數據集,有100000個訓練示例和10000個驗證示例。圖像的分辨率只有64x64像素,這使得從中提取信息更具挑戰性。從圖像上看,人眼很難在某些圖像中檢測到物體。

3. DenseNet

我們使用DenseNet[3]的概念來設計我們的模型架構。深度神經網絡的主要挑戰是梯度消失問題。這個問題首先通過引入剩餘網絡來解決,剩餘網絡使用一個快捷連接將輸入從一個塊傳遞到另一個塊。與ResNet不同,DenseNet沒有通過求和聚合特徵;相反,它們是通過連接來組合的。因此,信息從一層傳遞到所有後續層,以確保信息和梯度在整個網絡中更好地流動。

 

4. 方法

 

圖2 DenseNet網絡體系結構

4.1 感受野

對於我們兩個網絡,我們通過首先計算接收場來實現模型中的層數[6]。在我們的模型中,我們使用了(3x3)的卷積核和步長爲(1,1)的內核。因此,對於第一層,當每個核一次卷積超過(3x3)像素或9像素時,接收場爲(3x3)。每一個這樣的卷積運算都會使矩陣的空間維數減少2,從而使網絡的接收場增加2。而在MaxPooling層,矩陣的空間維數減少了一半,從而使整個感受野加倍。網絡的接收場計算如圖3所示:

 

                                                                                          圖3網絡感受野

當我們到達原始圖像大小爲64x64的接收場時,我們希望我們的模型能夠清晰地檢測出每個圖像中的對象,並能夠對它們進行分類。然而,更進一步使得一個接收場超過原來圖像大小的兩倍,使網絡也能學習更多背景細節。由於背景控制,我們的數據集中的許多圖像令人困惑,因此對於這些圖像,我們希望我們的模型能夠理解我們的對象所在的上下文。

 

                                                                                            圖4牛蛙圖片

例如,在圖4所示的牛蛙類中,我們可以觀察到,除了我們的對象(即牛蛙)之外,大多數圖像都具有綠色背景。我們希望我們的網絡除了學習我們的對象之外,還學習這一點。

4.2 模型設計

一開始,我們不費吹灰之力就分別實現了普通的ResNet-34和ResNet-50模型作爲我們的網絡1和網絡2。對於ResNet-34,我們在訓練集和驗證集上分別獲得了99.8%和33.5%的準確率,批處理大小爲500個圖像,運行100個階段。對於ResNet-50,我們在兩個訓練集上獲得了49%的準確率,在驗證集上獲得了26.2%的準確率,批處理大小爲512個圖像,運行50個批次。儘管這顯示了ResNet模型的學習能力,但我們注意到,由於在淺層數據集上使用了深網絡,驗證精度早就飽和了[7]。

基於斯坦福231n課程項目報告[8]中解釋的方法,我們考慮了一種構建定製DenseNet模型的改進方法,其設計元素爲ResNet-18。該方法背後的適當原因可以從這樣一個事實確定:對於64x64圖像上的深網絡,問題出現在最初幾層之後,它開始作爲大小爲1x1的標識圖工作,每增加一層就可以忽略不計。所以我們選擇一個大約15個卷積層的淺層網絡,在輸出之前,它的寬度足以容納大約1000個信道。

對於網絡1

(1)我們構建了一個由3個“瓶頸”塊組成的定製體系結構,每個塊的末尾有5個增加通道的卷積層和1個最大池層。

(2)在應用連接之前,我們將每個塊的輸出饋送到space_to_depth函數。此函數確保連接前兩層的空間維度相等。

(3)我們將每個塊輸出的跳過連接與下一個塊的輸出連接起來,在將兩個塊的信息輸入到下一個塊之前保留它們。

(4)模型的最後一層是1x1卷積層,後面是一個全局平均池層,它平均任何大小矩陣的空間維度。這一層使我們能夠設計一個模型,它可以接受任何大小的輸入圖像。我們將利用這一事實來更好地訓練我們的模型(將在圖像增強中進一步說明)。

對於網絡2,我們修改了ResNet-18架構,如下所示:

(1)我們將最初由64(7x7)個帶步長(2,2)的濾波器組成的第一個卷積層替換爲32(3x3)個帶步長(1,1)的濾波器,並刪除了最大池層。

(2)我們移除了由4個64(3x3)濾波器卷積層組成的第一個塊。

(3)我們在每2個卷積層之後移除跳躍連接,而不是在4個卷積層之後繼續保留。我們在快捷方式中將原來的add函數替換爲串聯,這樣它就保留了前一個塊中的通道,而不合並它們。我們在每個快捷方式之後添加了一個批量規範化和ReLU激活層。

(4)根據項目的需要,我們用1x1卷積層替換了最終的FC層,以將信道數減少到所需的類數,然後是Global Average Pooling層。

​​​​​​​4.3 圖像增強

爲了人爲地增加訓練數據量,避免過度擬合,我們依賴於圖像增強。

對於網絡1,我們使用直接和間接方法來實現圖像增強。首先,作爲一種間接的方法,我們爲最初的幾個時期提供32x32分辨率的圖像,然後是64x64分辨率的圖像。然後我們爲接下來的幾個時期提供分辨率爲16x16的圖像,最後爲模型提供分辨率爲64x64的圖像。這背後的原因是將低信息量的擴展數據輸入到模型中,直到驗證精度達到飽和,這樣它就可以從這些圖像中學習一些特徵。這項技術使我們的驗證準確率提高了3-4%。

在50%的驗證精度下,我們直接應用了來自imgaug庫的圖像增強[11]。我們手動提供參數的範圍,並從每個圖像的列表中隨機選擇增強項(從0到全部)。我們使用了以下增強:

  • •Scale  
  • •Coarse Dropout
  • •Rotate
  • •Additive Gaussian Noise
  • •Crop and Pad

應用這一方法,我們得到了9.5%的驗證準確率後,再運行150個階段。

對於Network 2,在整個運行過程中,我們保持默認的64x64圖像分辨率作爲輸入大小。我們沒有像網絡1那樣在經過一定次數的迭代後應用圖像增強,而是使用imgaug庫[11]從模型運行開始,將11個變換的隨機序列[8]應用到數據集的一半。每個變換的強度在指定的範圍內隨機確定,但這些範圍參數是手動提供的,以便這些變換後的訓練圖像能夠在驗證數據集中緊密地表示圖像。應用的增強是:

  • •Horizontal Flip
  • •Vertical Flip
  • •Gaussian Blur
  • •Crop and Pad
  • •Scale
  • •Translate
  • •Rotate
  • •Shear
  • •Coarse Dropout
  • •Multiply
  • •Contrast Normalisation

​​​​​​​4.4 正則化、優化器、超參數和回調

批處理規範化有助於在每個批處理中使前一層的輸入正常化,使值保持在平均值等於0、標準偏差等於1的可比較範圍內。這確保了我們模型的激活不會在任何一個特定的點上發生傾斜,同時也提高了計算速度。對於這兩個網絡,我們在每個卷積後應用了批處理規範化。然後將這些值傳遞給ReLU激活函數。我們用準確度作爲度量,用分類交叉熵作爲損失函數。

對於Network 1,我們選擇了默認學習率爲1e-3的默認Adam優化器,它給了我們很好的結果,但每個批次都在波動。我們沒有使用任何內核正則化器,也沒有更改此網絡的內核初始值設定項的默認值。我們使用ReduceLRonPlateau作爲回調函數,在驗證損失停滯5個批次時降低學習率。

對於網絡2,我們對每個卷積層使用lambda值爲2e-4[8]的L2核正則化器和方差縮放核初始值設定項[8]。我們使用Adam優化器,學習率爲1e-4,epsilon值爲1e-8。我們沒有像網絡1那樣在高原期間降低學習率,而是使用循環學習率方法[12],在特定迭代次數的值範圍內改變學習率。這種技術有助於我們在更少的時間段內獲得更好的驗證精度。我們使用三角形2比率策略,在每個週期中將最大學習比率減半。作爲對原文獻[12]提出的一個修正,在一定的循環次數之後,直到最後,我們並沒有逐漸減小循環和步長的範圍值。相反,對於驗證精度沒有顯示出比前一個範圍任何增加的週期,我們增加這些週期的學習率範圍,然後降低下一個週期的學習率範圍。在這裏,對於學習率範圍從1e-7到6e-7的循環,在範圍從1e-6到6e-6的循環之後,我們沒有看到驗證準確性的提高,因此我們增加了這些循環的學習率範圍從1e-5到6e-5,然後減少了下一個循環的範圍從1e-7到6e-7。這使我們的驗證準確率提高了0.3%。

下表1總結了這一點。

 

由於Google Colab[5]筆記本電腦的連續使用時間限制爲12小時,因此對於兩次模型運行,我們都使用了一個模型檢查點來以最佳的驗證精度保存模型,因爲我們必須爲每個網絡運行100多個批次。

5. 實驗結果

對於網絡1,我們使用1790萬個參數對235個批次進行了模型訓練,32x32和16x16分辨率圖像的批處理大小爲256,64x64分辨率圖像的批處理大小爲64。首先,我們對15個批次的32x32分辨率的訓練圖像進行了測試,驗證準確率達到25%。此時,模型已經開始過擬合,所以我們切換到64x64分辨率的圖像和運行了30個批次,驗證準確率提高到48%。爲了在低分辨率圖像上訓練該模型並模擬放大,我們在16×16分辨率圖像上僅訓練了10個批次。我們在這裏保持較低的時期,因爲雖然我們希望模型從低信息圖像中學習,但我們也希望避免過度擬合。我們改回64x64分辨率的圖像,並堅持到它的其餘訓練。在運行了30多個批次之後,我們的驗證精度達到了48-49%左右,現在我們實現了圖像增強。我們對每幅圖像進行了一些增強,並將我們的模型運行了150個批次。由於多次增強,現在模型訓練得慢得多,但尚未開始過度擬合。訓練和驗證準確率之間的差距仍然很小,我們對其進行了訓練,直到驗證準確率飽和到59%左右。在這裏,訓練精度達到67%,所以我們沒有進一步訓練,以避免過度擬合。我們使用模型檢查點從培訓中選擇了最佳模型,在驗證數據集上的準確率爲59.5%。

 

                                                                                    圖6 網絡1的損失曲線

對於Network 2,我們使用1180萬個參數對108個批次(批量大小爲128張圖像)的模型進行了訓練。如圖7所示,週期性學習率幫助我們提前獲得更高的驗證精度,大大降低了驗證損失。我們還清楚地看到,在70個批次之後,我們的驗證損失幾乎達到了10個批次的平穩水平。當我們應用更高的週期學習率範圍時,損失突然增加是顯而易見的,之後,雖然訓練精度繼續下降,但驗證精度達到了一個新的平臺。在108個批次結束時,我們獲得了62.73%的驗證準確率,而我們的訓練準確率保持在68.11%,再次表明差距很小。

 

                                                                                    圖7 網絡2的損失曲線

這兩個網絡的驗證精度均高於淺層ConvNets[7]和ResNet-18(無Dropout)模型[9],並且非常接近最先進的ResNet-18(具有多種Dropout技術)模型[10]。

6. 錯誤分析

我們將最後一個模型所犯的Top 1個錯誤的一些有趣的例子可視化,如圖8所示。

 

                                                                                   圖8錯誤標記類的示例

總的來說,這些錯誤通常是由於三個主要原因造成的[8]:圖像分辨率低、對圖像中主要實體的誤解以及類似項目的混淆。通過對正確和錯誤分類圖像的手動檢查,我們可以得出以下詳細結論:

在正確分類的圖像中,我們觀察到物體和背景之間有明顯的區別。每一個最佳分類類別的圖像往往在其內部共享相同的特徵,如顏色、紋理等。此外,該模型在檢測覆蓋整個64x64分辨率且具有最小背景的對象時表現得非常好。儘管對於“flagpole”、“flagstaff”等類,該模型能夠檢測放大和縮小的對象。這可能是因爲我們提供了低分辨率圖像,並使用了縮放增強。

在分類錯誤的圖像中,由於圖像分辨率低,許多圖像被錯誤分類。其中有些甚至很難被人類區分開來。例如,一隻“埃及貓”被誤分類爲“虎斑貓”,或者一隻“拉布拉多獵犬”被誤分類爲“黃金獵犬”。在這裏,由於圖像中的細節不多,考慮到64x64的低分辨率,模型可以檢測出物體的類型(如狗),但無法進一步將其細分爲正確的類(如拉布拉多尋回犬和金毛尋回犬)。

另一類分類錯誤的圖像是由於對圖像意圖的誤解[8]。這盤水果被歸類爲“香蕉”,僅僅是因爲裏面確實有香蕉;然而,真正的標籤是“橙色”。一盤本來被歸類爲“肉卷”的食物,卻被歸類爲“盤”,這是完全合理的。這種錯誤是不可能改正的。一個圖像中通常有多個實體;我們的網絡正確地解釋了這些圖像,但沒有解釋真正正確的內容。

最後一種誤分類圖像是由於類別之間的距離太近,有時甚至存在一些重疊。“敞篷車”被錯誤地歸類爲“跑車”,但實際上,很大一部分“敞篷車”也是“跑車”。

綜上所述,雖然近30%的圖像沒有被正確分類,但大量的錯誤是合理的,有些甚至是可以原諒的。表2顯示了按我們的網絡劃分的最差類別:

 

在分析我們的預測之後,我們將正確和錯誤標記的圖像分開,並將錯誤標記的圖像過採樣三倍於正確標記的圖像。我們還嘗試了另一種方法,對低精度類進行軟加權。我們希望我們的模型能夠更好地利用這些技術來學習錯誤分類的圖像;然而,我們的模型開始過度擬合,我們觀察到驗證精度沒有提高。

7. 總結

我們試圖在非常高的約束條件和稀缺的計算資源下克服微型ImageNet數據集的挑戰。通過設計兩個非常適合挑戰的定製DenseNet模型,我們的網絡能夠以59.5%和62.7%的前1名準確率取得很好的結果。我們使我們的模型儘可能寬,而不是太淺,以提取最大的特徵,並防止過度擬合我們的64分辨率圖像。我們對兩個模型都使用了幾種數據增強技術來提高驗證的準確性。爲了從圖像中提取更多的信息,我們使用了一些很有前途的技術,例如輸入圖像的不同分辨率,以及提供不同範圍的循環學習速率範圍。實施這兩種技術後,我們觀察到,在幾個週期內,它可能會對訓練產生短期負面影響,但從驗證準確性的躍升中明顯地顯示出長期有益的影響。我們將通過在其他開放數據集上應用這些技術來進一步努力。最後,我們對最終模型產生的誤分類圖像進行了人工檢驗,獲得了有價值的見解。爲了進一步的研究,我們將根據所獲得的見解,通過定製圖像增強參數來微調我們的模型。我們還將關注網絡的架構,並致力於實現更高的精度。


參考文獻

[1] http://www.image-net.org/.

[2] K. He, X. Zhang, S. Ren, J. Sun, Deep Residual Learning for Image Recognition,

arXiv:1512.03385v1, 2015

[3] G. Huang, Z. Liu, L. v. d. Maaten, K. Q. Weinberger, Densely Connected Convolutional Networks, arXiv:1608.06993v5, 2018

[4] https://tiny-imagenet.herokuapp.com/

[5] https://colab.research.google.com/

[6] H. Le, A. Borji, What are the Receptive, Effective Receptive, and Projective Fields of Neurons in Convolutional Neural Networks?, arXiv:1705.07049v2, 2018

[7] S. H. S. Basha, S R Dubey, V Pulabaigari, S Mukherjee, Impact of Fully Connected Layers on Performance of Convolutional Neural Networks for Image Classification , arXiv:1902.02771v2, 2019

[8] http://cs231n.stanford.edu/reports/2017/pdfs/ [pdfs: 12 & 930]

[9] M. S. Ebrahimi, H. K. Abadi, Study of Residual Networks for Image Recognition, arXiv:1805.00325v1, 2018

[10] R. Keshari, R. Singh, M. V atsa, Guided Dropout, arXiv:1812.03965v1, 2018

[11] https://github.com/aleju/imgaug

[12] L. N. Smith, Cyclical Learning Rates for Train Neural Networks , arXiv:1506.01186v6, 2017

[13] https://in.linkedin.com/in/rohanshravan


參考代碼:https://github.com/ZohebAbai/Tiny-ImageNet-Challenge

因爲原碼是在Google colab上運行的,並且tensorflow的版本要求也不同!下面附上我自己在源碼上的修改:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章