1. 程式人生 > >用PyTorch建立一個影象分類器?So easy!(Part 1)

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

經過了幾個月的學習和實踐,我完成了優達學城網站上《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.特徵層的輸出和自定義分類器的輸入大小必須相匹配。

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

 


原文連結
本文為雲棲社群原創內容,未經允許不得轉載。