關於CNN圖像分類的一份綜合設計指南

摘要: 本文是一篇關於使用CNN完成圖像分類的綜合設計指南,涵蓋了一些模型設計、模型優化以及數據處理經驗,是一份適合圖像分類方向研究者參考的綜合設計指南。算法

對於計算機視覺任務而言,圖像分類是其中的主要任務之一,好比圖像識別、目標檢測等,這些任務都涉及到圖像分類。而卷積神經網絡(CNN)是計算機視覺任務中應用最爲普遍且最爲成功的網絡之一。大多數深度學習研究者首先從CNN入門,上手的第一個項目應該是手寫體MNIST數字圖像識別,經過該項目可以大體掌握圖像分類的基本操做流程,但因爲該項目太成熟,按步驟操做一遍可能只知其然而不知其因此然。因此,當遇到其它圖像分類任務時,研究者可能不知道如何開始,或者不知道選取怎樣的預訓練網絡模型、或者不知道對已有的成熟模型進行怎樣的調整、模型的層數怎樣設計、如何提高精度等,這些問題都是會在選擇使用卷積神經模型完成圖像分類任務時應該考慮的問題。
當選擇使用CNN進行圖像分類任務時,須要優化3個主要指標:精度、仿真速度以及內存消耗。這些性能指標與設計的模型息息相關。不一樣的網絡會對這些性能指標進行權衡,好比VGG、Inception以及ResNets等。常見的作法是對這些成熟的模型框架進行微調、好比經過增刪一些層、使用擴展的其它層以及一些不一樣的網絡訓練技巧等完成相應的圖像分類任務。
本文是關於使用CNN進行圖像分類任務的優化設計指南,方便讀者快速掌握圖像分類模型設計中所遇到的問題及經驗。全文集中在精度、速度和內存消耗這三個性能指標進行擴展,介紹不一樣的CNN分類方法,並探討這些方法在這三個性能指標上的表現。此外,還能夠看到對這些成熟的CNN方法進行各類修改以及修改後的性能表現。最後,將學習如何針對特定的圖像分類任務優化設計一個CNN網絡模型。網絡

網絡類型

clipboard.png

網絡類型和性能指標之間有一個很是明顯的權衡現象。首先確定會選擇Inception或ResNet網絡類型的模型,由於這兩個網絡比VGG和AlexNet模型更新,只是在精度和仿真速度兩個指標之間進行了權衡,若是想要精度,選擇ResNet網絡是個不錯的開端,若是想要仿真速度快,那就選擇Inception網絡。框架

用智能卷積設計減小運行時間和內存消耗

CNN整體設計的最新進展已經有一些使人驚歎的替代方案,在不損失太多精度的前提下,能夠加快CNN仿真運行的時間並減小內存消耗。如下全部的這些均可以很容易地集成到上述CNN成熟模型之中:機器學習

  • MobileNets:使用深度可分離卷積技術,在僅犧牲1%~5%的精度的條件下,極大地減小了計算量和內存消耗量,精度的下降程度與計算量和內存消耗量的降低成正比。
  • XNOR-Net:使用二進制卷積,即卷積核只有兩種取值:-1或1。經過這種設計使得網絡具備很高的稀疏性,所以能夠很容易地壓縮網絡參數而不會佔用太多內存。
  • ShuffleNet:使用逐點羣卷積(pointwise group convolution)和信道重排(channel
    shuffle)大大下降計算成本,同時網絡模型的精度要優於MobileNets。
  • Network
    Pruning(網絡剪枝):去除CNN模型的部分結構以減小仿真運行時間和內存消耗,但也會下降精度。爲了保持精度,去除的部分結構最好是對最終結果沒有多大的影響。

網絡深度

對於CNN而言,有一些經常使用的方法是增長通道數以及深度來增長精度,可是會犧牲仿真運行速度和內存。然而,須要注意的是,層數增長對精度的提高的效果是遞減的,即添加的層越多,後續添加的層對精度的提高效果越小,甚至會出現過擬合現象。ide

clipboard.png

激活函數

對於神經網絡模型而言,激活函數是必不可少的。傳統的激活函數,好比Softmax、Tanh等函數已不適用於CNN模型,有相關的研究者提出了一些新的激活函數,好比Hinton提出的ReLU激活函數,使用ReLU激活函數一般會獲得一些好的結果,而不須要像使用ELU、PReLU或LeakyReLU函數那樣進行繁瑣的參數調整。一旦肯定使用ReLU可以得到比較好的結果,那麼能夠優化網絡的其它部分並調整參數以期待更好的精度。函數

卷積核大小

人們可能廣泛認爲使用較大的卷積核(好比5x五、7x7)老是會產生最高的精度,然而,並不老是這樣。研究人員發現,使用較大的卷積核使得網絡難以分離,最好的使用像3x3這樣更小的內核,ResNet和VGGNet已經很好地證實了這一點。此外,也可使用1x1這樣的卷積核來減小特徵圖(Feature map)的數量。性能

空洞卷積

空洞卷積(Dilated Convolutions)使用權重之間的間距以便可以使用遠離中心的像素,這種操做容許網絡在不增長網絡參數的前提下增大感覺野,即不增長內存消耗。相關論文代表,使用空洞卷積能夠增長網絡精度,但也增長仿真運行消耗的時間。學習

clipboard.png

數據擴充

深度學習依賴於大數據,使用更多的數據已被證實能夠進一步提高模型的性能。隨着擴充的處理,將會免費得到更多的數據,使用的擴充方法取決於具體任務,好比,你在作自動駕駛汽車任務,可能不會有倒置的樹、汽車和建築物,所以對圖像進行豎直翻轉是沒有意義的,然而,當天氣變化和整個場景變化時,對圖像進行光線變化和水平翻轉是有意義的。這有一個很棒的數據擴充庫。大數據

訓練優化

當對網絡訓練過程優化時,有幾種優化算法可供選擇。經常使用的算法是隨機梯度降低算法(SGD),但該算法須要調整學習率等參數,這一過程略顯乏味;另外使用自適應學習率梯度降低算法,好比Adam、Adagrad或Adadelta算法,是比較容易實現的,可是可能沒法得到最佳的梯度降低算法精度。優化

最好的辦法是遵循和激活函數相似的處理方式,先用簡單的訓練方法來看看設計的模型是否工做得很好,而後用更復雜的方式進行調整和優化。我的推薦從Adam開始,該方法使用起來很是容易:只須要設定一個不過高的學習率,一般默認設置爲0.0001,這樣通常會獲得很是好的效果,以後可使用SGD算法進行微調。

clipboard.png

類別平衡

在不少狀況下,可能會遇到數據不平衡問題。數據不平衡是什麼意思呢?舉一個簡單的例子:假設你正在訓練一個網絡模型,該模型用來預測視頻中是否有人持有致命武器。可是訓練數據中只有50個持有武器的視頻,而有1000個沒有持有武器的視頻。若是使用這個數據集完成訓練的話,模型確定傾向於預測視頻中沒有持有武器。
針對這個問題,能夠作一些事情來解決:

  • 在損失函數中使用權重:對數據量小的類別在損失函數中添加更高的權重,使得對於該特定類別的任何未正確分類將致使損失函數輸出很是高的錯誤。
  • 過採樣:重複包含表明性不足類別的一些訓練實例有助於提高模型精度。
  • 欠採樣:對數據量大的類別進行採樣,下降兩者的不平衡程度。
  • 數據擴充:對數據量小的類別進行擴充。

優化遷移學習

對於大多數數據而言,通常的作法是使用遷移學習,而不是從頭開始訓練網絡模型。遷移學習就是基於一些成熟的模型,使用其部分網絡結構參數,只訓練一些新的網絡部件。在這個過程當中遇到的問題是,選擇什麼樣的模型進行遷移學習,保留哪些網絡層、哪些網絡部件須要從新訓練,這都取決於你的數據集是什麼樣子。若是你的數據與預訓練的網絡(網絡通常是經過ImageNet數據集訓練)更類似,那麼須要從新訓練的網絡部件也越少,反之亦然。例如,假設正在嘗試區一個圖像是否包含葡萄,那麼數據集是由包含葡萄的圖像與不包含圖像組成,這些圖像與ImageNet中的圖像很是類似,因此只須要從新訓練選取的模型最後幾層,也許只是訓練最後的全鏈接層,由於ImageNet是區分1000類,而本次任務只區分兩類——圖像中包不包含葡萄,因此只需更改最後的全鏈接層參數。又假設正在嘗試分類外太空圖像中是否包含行星,這類的數據與ImageNet的數據集有很大的不一樣,所以須要從新訓練模型後面的卷積層。

clipboard.png

結論

本文是針對使用CNN完成圖像分類任務的優化設計指南,給出了一些常見的優化方式,便於初學者按照給定的規則調整優化網絡模型。

本文做者:George Seif,機器學習工程師,
本文由阿里云云棲社區組織翻譯。
文章原標題《A Comprehensive Design Guide for Image Classification CNNs》,譯者:海棠,審校:Uncle_LLD。

原文連接本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索