
本文為 AI 研習社編譯的技術部落格,原标題 :
Implementing an Image Classifier with PyTorch: Part 2
作者 | Jose Nieto
翻譯 | Jeffery26
校對 | 醬番梨 稽核 | 醬番梨 整理 | 立魚王
原文連結:
https://medium.com/udacity/implementing-an-image-classifier-with-pytorch-part-2-ae4dd7b2f48
檢視第一部分,請戳>>手把手教你用PyTorch實作圖像分類器(第一部分)
回想一下,在本系列文章的第一篇中,我們學習了為什麼需要載入預訓練網絡以及如何載入預訓練網絡,同時我們示範了如何将預訓練網絡的分類器替換為我們自己的分類器。在本篇推文中,我們将學習如何訓練自己的分類器。
訓練分類器
首先我們要做的是将訓練用的圖檔喂給我們的分類器,我們可以使用PyTorch中的ImageFolder接口載入圖檔。預訓練網絡要求我們輸入的都是某種特定格式的圖檔,是以,在将圖檔喂給神經網絡前,我們需要對圖檔進行某些變換以達到對圖檔的裁剪和歸一化。
具體來說,我們會将輸入圖檔裁剪至224x224尺寸并且使用[0.485, 0.456, 0.406]和[0.229, 0.224, 0.225]兩個參數作為均值和标準差進行歸一化。歸一化使得圖檔顔色通道數值中心化于0同時使得标準差為1。
接着我們可以使用PyTorch中的DataLoader接口将所有圖檔分成不同的批次。因為我們需要三種圖檔資料集——訓練集,驗證集和測試集,是以我們需要為每個資料集分别建立一個讀取器。好了,萬事俱備,我們可以開始訓練我們的分類器了。
進行到此處我們将碰到最重要的挑戰:模型準确度
讓我們的模型去識别一張我們事先已經标注好類别的圖檔并不難,然而我們需要我們的模型擁有泛化能力,即讓模型可以識别我們從未标注過的花卉圖檔中的花卉種類。我們可以通過防止模型的過拟合達到模型泛化的目的。過拟合的意思為:我們的模型參數太過于滿足我們自己的訓練圖檔的準确度,進而可能導緻無法對除了訓練集之外的其他圖檔進行準确識别。即模型在訓練集上表現優越,但是在測試集和驗證集上誤差很大。
Fitting types
不同的參數可以幫助模型達到最佳拟合
-隐藏層
我們總是很容易陷入更多或更大的隐藏層能夠提高分類器準确性這樣的思維誤區,然而這個說法不總是對的。
增加隐藏層的數量和尺寸會使得我們的分類器考慮更多除了那些至關重要的參數以外的參數。例如,将噪音也視為花卉的一部分。這将導緻過拟合以及模型準确度的下降。不僅如此,增加隐藏層的數量和尺寸也将花費我們更多時間去訓練分類器和利用分類器去預測結果。
正因如此,我們建議開始訓練網絡時采用較少數量和較小尺寸的隐藏層,同時隐藏層的數量和尺寸根據訓練進展按需增加,而不是一開始便在網絡中加入大量和大尺寸的隐藏層。
在Udacity的利用python進行AI程式設計納米學位項目中的花卉分類器項目中(我在本系列文章的第一篇推文中介紹了該項目),利用訓練集進行第一次全訓練輪次時,我僅僅利用包含一層小規模隐藏層的網絡便獲得了超過70%的準确度
-資料增強
我們有一批圖檔用來訓練我們的模型,這是極好的事情,但是如果我們有更多的圖檔,這将會變得更好。此時資料增強便派上了用場。在訓練模型的每一回合中,每張圖檔會被喂入網絡一次。但是在每次喂給網絡之前,我們可以對圖檔進行任意的變換,例如旋轉,平移,縮放。通過這種方式,在不同的訓練回合中,同一張圖檔将會以不同的形式喂給神經網絡。增加訓練資料的多樣性可以減少過拟合的出現機率,相應地也提高了模型的泛化能力,進而提高了模型總體的準确性。
-打亂資料集
當訓練神經網絡時,為了防止模型出現任何偏向性,我們需要以任意順序将圖檔喂給神經網絡。
例如,一開始如果我們隻将矮牽牛花圖檔喂給分類器,那麼該分類器的張量很容易傾向于矮牽牛花。事實上,此時此刻,我們的分類器将會隻知道矮牽牛花這一種花。即使接下來我們使用其他種類花卉圖檔來繼續訓練模型,這種最初的對于某種花卉的傾向性将會随着時間繼續存在。雷鋒網
為了防止這種現象的發生,我們需要在資料載入器中打亂圖檔順序,隻需要簡單的一步——在建立載入器時添加shuffle=True語句即可。
-随機失活
有時,分類器内的神經網絡節點會産生過多的影響,進而使得其他節點不能進行正常的訓練。同時,節點之間會産生互相依存關系進而導緻過拟合。
随機失活是在每一次訓練中通過使一些節點随機失活來防止上述現象發生的一種訓練技巧。因而,每一次訓練中分别訓練了所有節點中的不同子集,進而減少了過拟合現象的發生。
Dropout diagram (Source)
暫且先不談論過拟合,我們需要時刻記住的是學習率可能是最重要的超參數。如果學習率太大,我們可能永遠得不到誤差的最小值,如果學習率太小,分類器的訓練過程會變得非常漫長。典型的學習率數值分别是:0.01,0.001,0.0001等等。
最後但也仍然非常重要的是,對位于分類器最後一層的激活函數的正确選擇也會大幅改善模型準确度。例如,如果在神經網絡中我們使用了負對數似然損失函數,按照文檔所述,那麼建議在最後一層使用LogSoftmax激活函數。雷鋒網
總結
為了訓練一個擁有泛化能力,同時在預測新圖檔中的花卉種類有着高準确度的模型,了解模型訓練過程是非常有用的。
在文章中我們讨論了過拟合是如何影響模型的泛化能力以及如何防止過拟合的發生。同時我們也提及了學習率的重要性以及常用的學習率。最後,我們可以看出在最後一層中選擇正确的激活函數也是至關重要的。
既然我們知道了如何訓練模型,我們便可以使用模型去識别模型從未見過的圖檔中的花卉種類。那将是我們在該系列第三篇和最後一篇推文中将要介紹的内容。
我希望此篇文章對你有所幫助同時你能對我們說出你對此篇文章的想法。
想要繼續檢視該篇文章相關連結和參考文獻?
點選【手把手教你用PyTorch實作圖像分類器(第二部分)】即可通路:雷鋒網(公衆号:雷鋒網)
https://ai.yanxishe.com/page/TextTranslation/1587
AI入門、大資料、機器學習免費教程
35本世界頂級原本教程限時開放,這類書單由知名資料科學網站 KDnuggets 的副主編,同時也是資深的資料科學家、深度學習技術愛好者的Matthew Mayo推薦,他在機器學習和資料科學領域具有豐富的科研和從業經驗。
點選連結即可擷取:https://ai.yanxishe.com/page/resourceDetail/417