用PyTorch建立一個圖像分類器?So easy!(Part 1)

摘要: 本文將爲你介紹爲什麼要重用神經網絡?哪部分能夠重用,哪部分不能夠重用。瞭解完這些基礎概念,你就能夠自行建立一個圖像分類器了。html

通過了幾個月的學習和實踐,我完成了優達學城網站上《Python Programming with Python Nanodegree》課程的學習,該課程的終極項目就是使用Pytorch爲102種不一樣類型的花建立一個圖像分類器。node

在完成這個項目的過程當中,我和其餘學員同樣,都碰到了各類問題和挑戰,所以寫下了這篇文章。但願你讀完這篇文章之後,會對你的機器學習有所裨益。python

本文介紹瞭如何實現圖像分類的基礎概念,即理解圖像內容的算法。本文並不會詳細分步說明構建模型的具體步驟,而是從宏觀上介紹整個過程,若是你正在學習機器學習或人工智能,相信這篇文章將會對你頗有幫助。算法

在第一部分中,咱們將介紹加載預訓練的神經網絡,爲何要「重用」網絡(即便用預訓練神經網絡),指明哪些部分能夠重用,哪些部分不能夠重用,以及如何自定義預訓練網絡。網絡

加載一個預訓練網絡架構

「重用」是一個很是合理的策略,特別是當某些工具是你們都承認爲標準的時候,「重用」更顯得尤其重要。在這個例子中,咱們的出發點是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.特徵層的輸出和自定義分類器的輸入大小必須相匹配。

在下一篇文章中,咱們將深刻探討,在訓練分類器過程當中,如何避免一些常見的陷阱,並學習如何調整超參數,來提升模型的準確性。

原文連接

相關文章
相關標籤/搜索