python cnn图像分类_关于CNN图像分类的一份综合设计指南
摘要: 本文是一篇關于使用CNN完成圖像分類的綜合設計指南,涵蓋了一些模型設計、模型優(yōu)化以及數據處理經驗,是一份適合圖像分類方向研究者參考的綜合設計指南。
對于計算機視覺任務而言,圖像分類是其中的主要任務之一,比如圖像識別、目標檢測等,這些任務都涉及到圖像分類。而卷積神經網絡(CNN)是計算機視覺任務中應用最為廣泛且最為成功的網絡之一。大多數深度學習研究者首先從CNN入門,上手的第一個項目應該是手寫體MNIST數字圖像識別,通過該項目能夠大致掌握圖像分類的基本操作流程,但由于該項目太成熟,按步驟操作一遍可能只知其然而不知其所以然。所以,當遇到其它圖像分類任務時,研究者可能不知道如何開始,或者不知道選取怎樣的預訓練網絡模型、或者不知道對已有的成熟模型進行怎樣的調整、模型的層數怎樣設計、如何提升精度等,這些問題都是會在選擇使用卷積神經模型完成圖像分類任務時應該考慮的問題。
當選擇使用CNN進行圖像分類任務時,需要優(yōu)化3個主要指標:精度、仿真速度以及內存消耗。這些性能指標與設計的模型息息相關。不同的網絡會對這些性能指標進行權衡,比如VGG、Inception以及ResNets等。常見的做法是對這些成熟的模型框架進行微調、比如通過增刪一些層、使用擴展的其它層以及一些不同的網絡訓練技巧等完成相應的圖像分類任務。
本文是關于使用CNN進行圖像分類任務的優(yōu)化設計指南,方便讀者快速掌握圖像分類模型設計中所遇到的問題及經驗。全文集中在精度、速度和內存消耗這三個性能指標進行擴展,介紹不同的CNN分類方法,并探討這些方法在這三個性能指標上的表現。此外,還可以看到對這些成熟的CNN方法進行各種修改以及修改后的性能表現。最后,將學習如何針對特定的圖像分類任務優(yōu)化設計一個CNN網絡模型。
網絡類型
網絡類型和性能指標之間有一個非常明顯的權衡現象。首先肯定會選擇Inception或ResNet網絡類型的模型,因為這兩個網絡比VGG和AlexNet模型更新,只是在精度和仿真速度兩個指標之間進行了權衡,如果想要精度,選擇ResNet網絡是個不錯的開端,如果想要仿真速度快,那就選擇Inception網絡。
用智能卷積設計減少運行時間和內存消耗
CNN總體設計的最新進展已經有一些令人驚嘆的替代方案,在不損失太多精度的前提下,可以加快CNN仿真運行的時間并減少內存消耗。以下所有的這些都可以很容易地集成到上述CNN成熟模型之中:
MobileNets:使用深度可分離卷積技術,在僅犧牲1%~5%的精度的條件下,極大地減少了計算量和內存消耗量,精度的降低程度與計算量和內存消耗量的下降成正比。
XNOR-Net:使用二進制卷積,即卷積核只有兩種取值:-1或1。通過這種設計使得網絡具有很高的稀疏性,因此可以很容易地壓縮網絡參數而不會占用太多內存。
ShuffleNet:使用逐點群卷積(pointwise group convolution)和信道重排(channel
shuffle)大大降低計算成本,同時網絡模型的精度要優(yōu)于MobileNets。
Network
Pruning(網絡剪枝):去除CNN模型的部分結構以減少仿真運行時間和內存消耗,但也會降低精度。為了保持精度,去除的部分結構最好是對最終結果沒有多大的影響。
網絡深度
對于CNN而言,有一些常用的方法是增加通道數以及深度來增加精度,但是會犧牲仿真運行速度和內存。然而,需要注意的是,層數增加對精度的提升的效果是遞減的,即添加的層越多,后續(xù)添加的層對精度的提升效果越小,甚至會出現過擬合現象。
激活函數
對于神經網絡模型而言,激活函數是必不可少的。傳統(tǒng)的激活函數,比如Softmax、Tanh等函數已不適用于CNN模型,有相關的研究者提出了一些新的激活函數,比如Hinton提出的ReLU激活函數,使用ReLU激活函數通常會得到一些好的結果,而不需要像使用ELU、PReLU或LeakyReLU函數那樣進行繁瑣的參數調整。一旦確定使用ReLU能夠獲得比較好的結果,那么可以優(yōu)化網絡的其它部分并調整參數以期待更好的精度。
卷積核大小
人們可能普遍認為使用較大的卷積核(比如5x5、7x7)總是會產生最高的精度,然而,并不總是這樣。研究人員發(fā)現,使用較大的卷積核使得網絡難以分離,最好的使用像3x3這樣更小的內核,ResNet和VGGNet已經很好地證明了這一點。此外,也可以使用1x1這樣的卷積核來減少特征圖(Feature map)的數量。
空洞卷積
空洞卷積(Dilated Convolutions)使用權重之間的間距以便能夠使用遠離中心的像素,這種操作允許網絡在不增加網絡參數的前提下增大感受野,即不增加內存消耗。相關論文表明,使用空洞卷積可以增加網絡精度,但也增加仿真運行消耗的時間。
數據擴充
深度學習依賴于大數據,使用更多的數據已被證明可以進一步提升模型的性能。隨著擴充的處理,將會免費獲得更多的數據,使用的擴充方法取決于具體任務,比如,你在做自動駕駛汽車任務,可能不會有倒置的樹、汽車和建筑物,因此對圖像進行豎直翻轉是沒有意義的,然而,當天氣變化和整個場景變化時,對圖像進行光線變化和水平翻轉是有意義的。這有一個很棒的數據擴充庫。
訓練優(yōu)化
當對網絡訓練過程優(yōu)化時,有幾種優(yōu)化算法可供選擇。常用的算法是隨機梯度下降算法(SGD),但該算法需要調整學習率等參數,這一過程略顯乏味;另外使用自適應學習率梯度下降算法,比如Adam、Adagrad或Adadelta算法,是比較容易實現的,但是可能無法獲得最佳的梯度下降算法精度。
最好的辦法是遵循和激活函數類似的處理方式,先用簡單的訓練方法來看看設計的模型是否工作得很好,然后用更復雜的方式進行調整和優(yōu)化。個人推薦從Adam開始,該方法使用起來非常容易:只需要設定一個不太高的學習率,通常默認設置為0.0001,這樣一般會得到非常好的效果,之后可以使用SGD算法進行微調。
類別平衡
在很多情況下,可能會遇到數據不平衡問題。數據不平衡是什么意思呢?舉一個簡單的例子:假設你正在訓練一個網絡模型,該模型用來預測視頻中是否有人持有致命武器。但是訓練數據中只有50個持有武器的視頻,而有1000個沒有持有武器的視頻。如果使用這個數據集完成訓練的話,模型肯定傾向于預測視頻中沒有持有武器。
針對這個問題,可以做一些事情來解決:
在損失函數中使用權重:對數據量小的類別在損失函數中添加更高的權重,使得對于該特定類別的任何未正確分類將導致?lián)p失函數輸出非常高的錯誤。
過采樣:重復包含代表性不足類別的一些訓練實例有助于提升模型精度。
欠采樣:對數據量大的類別進行采樣,降低二者的不平衡程度。
數據擴充:對數據量小的類別進行擴充。
優(yōu)化遷移學習
對于大多數數據而言,一般的做法是使用遷移學習,而不是從頭開始訓練網絡模型。遷移學習就是基于一些成熟的模型,使用其部分網絡結構參數,只訓練一些新的網絡部件。在這個過程中遇到的問題是,選擇什么樣的模型進行遷移學習,保留哪些網絡層、哪些網絡部件需要重新訓練,這都取決于你的數據集是什么樣子。如果你的數據與預訓練的網絡(網絡一般是通過ImageNet數據集訓練)更相似,那么需要重新訓練的網絡部件也越少,反之亦然。例如,假設正在嘗試區(qū)一個圖像是否包含葡萄,那么數據集是由包含葡萄的圖像與不包含圖像組成,這些圖像與ImageNet中的圖像非常相似,所以只需要重新訓練選取的模型最后幾層,也許只是訓練最后的全連接層,因為ImageNet是區(qū)分1000類,而本次任務只區(qū)分兩類——圖像中包不包含葡萄,所以只需更改最后的全連接層參數。又假設正在嘗試分類外太空圖像中是否包含行星,這類的數據與ImageNet的數據集有很大的不同,因此需要重新訓練模型后面的卷積層。
結論
本文是針對使用CNN完成圖像分類任務的優(yōu)化設計指南,給出了一些常見的優(yōu)化方式,便于初學者按照給定的規(guī)則調整優(yōu)化網絡模型。
本文作者:George Seif,機器學習工程師,
本文由阿里云云棲社區(qū)組織翻譯。
文章原標題《A Comprehensive Design Guide for Image Classification CNNs》,譯者:海棠,審校:Uncle_LLD。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的python cnn图像分类_关于CNN图像分类的一份综合设计指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的seaborn下载_Pyt
- 下一篇: python nonetype转换flo