
經過了幾個月的學習和實踐,我完成了優達學城網站上《
Python
Programming with Python Nanodegree
》課程的學習,該課程的終極項目就是使用Pytorch為
102種不同類型的花建立一個圖像分類器。
在完成這個項目的過程中,我和其他學員一樣,都碰到了各種問題和挑戰,是以寫下了這篇文章。希望你讀完這篇文章以後,會對你的機器學習有所裨益。
本文介紹了如何實作圖像分類的基礎概念,即了解圖像内容的算法。本文并不會詳細分步說明構模組化型的具體步驟,而是從宏觀上介紹整個過程,如果你正在學習機器學習或人工智能,相信這篇文章将會對你很有幫助。
在第一部分中,我們将介紹加載預訓練的神經網絡,為什麼要“重用”網絡(即使用預訓練神經網絡),指明哪些部分可以重用,哪些部分不可以重用,以及如何自定義預訓練網絡。
加載一個預訓練網絡“重用”是一個非常合理的政策,特别是當某些工具是大家都認可為标準的時候,“重用”更顯得尤為重要。在這個例子中,我們的出發點是
torchvision提供的一個模型架構。
現在,我們要做的是加載一個預先訓練好的網絡,并用自己的網絡替換它的分類器,然後,我們就可以訓練自己的分類器了。
雖然這個想法很合理,但是也比較麻煩,因為加載一個預先訓練好的網絡,并不會節省我們訓練分類器的工作量。
是以,使用預訓練網絡到底有什麼好處呢?當我們人類在看圖像的時候,我們會識别線條和形狀,鑒于此,我們才可以将圖像内容與之前看到的内容聯系起來。現在,我們希望分類器也能做到這點,但是,圖像并不是一個簡單的資料,而是由數千個獨立的像素組成,每個像素又由3個不同的值組合起來,形成顔色,即紅色、綠色和藍色。
從左到右,依次為:原始圖像,紅色,綠色,藍色。
如果我們希望分類器能夠處理這些資料,我們要做的就是将每個待處理圖像所包含的資訊,以分類器可以了解的格式傳給分類器,這就是預訓練網絡發揮作用的地方。
這些預訓練網絡主要由一組特征檢測器和分類器組成,其中,
特征檢測器被訓練成可以從每個圖像中提取資訊,分類器被訓練成了解特征層提供的輸入。
在這裡,特征檢測器已經在ImageNet中接受過訓練,并且性能良好,我們希望這點能夠繼續保持。在訓練分類器時,為了防止特征層被篡改,我們得對特征層進行“當機”,下面這些代碼可以很輕松的解決這一問題:
for param in model.parameters():
param.requires_grad = False
那麼,問題又來了,既然我們可以“重用”特征檢測器,我們為什麼不能“重用”分類器?要回答這個問題,我們先來看看VGG16架構的預設分類器:
(classifier): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace)
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace)
(5): Dropout(p=0.5)
(6): Linear(in_features=4096, out_features=1000, bias=True)
)
首先,我們沒辦法保證這些代碼能夠起作用,在我們特定的環境中,這些預設層、元素、激活函數以及Dropout值并不一定是最佳的。
尤其是最後一層的輸出是1000個元素,這就容易了解了。在我們的例子中,我們要對102種不同類型的花進行分類,是以,
我們的分類器輸出必須是 102 ,而不是 1000從上面VGG16架構的預設分類器中,我們還可以注意到,分類器的輸入層有25088個元素,這是特定預訓練模型中特征檢測器的輸出大小,
是以,我們的分類器大小也必須要與要特征層的輸出相比對 結論從上面的分析,本文能夠得到以下結論:
1.預先訓練好的網絡非常有用。使用預訓練模型,可以讓我們更加專注于我們自己用例的具體細節,還可以重用衆所周知的工具,對用例中的圖像進行預處理。
2.分類器的輸出大小必須與我們希望識别的圖像數量相同。
3.特征層的輸出和自定義分類器的輸入大小必須相比對。
在下一篇文章中,我們将深入探讨,在訓練分類器過程中,如何避免一些常見的陷阱,并學習如何調整超參數,來提高模型的準确性。
本文由北郵
@愛可可-愛生活老師推薦,
阿裡雲雲栖社群組織翻譯。
文章原标題《Implementing an Image Classifier with PyTorch》
譯者:Mags,審校:袁虎。
文章為簡譯,更為詳細的内容,請檢視
原文