2

我注意到,對新數據集的CNN進行的大多數微調僅在「最後」完全連接(fc)層完成。從較低的fc層微調CNN

我對從「第一個」完全連接層進行微調感興趣:也就是說,我想使用卷積和合並圖層的中級特徵(假設它是在ImageNet上訓練的),但是將所有fc圖層適合我的新數據集。

理論上和實踐中,這是什麼效果?是否有可能爲我的新數據集學習更合適的一組參數?

回答

3

從理論上講,您調整得越深,模型越適合您的數據。所以,如果你可以調整整個模型 - 越好。

那麼,有什麼問題,你必須問,爲什麼不每個人都調整整個模型?首先,微調整個模型需要大量的參數,爲了適當地訓練數百萬個參數而沒有過度擬合的風險,你必須有很多新的訓練樣例。在大多數情況下,微調時,只有少數註釋樣本用於新任務,因此無法對整個模型進行微調。其次,微調整個模型花費的時間要比訓練頂層fc層要長得多。因此,如果您只有很少的時間和預算,您只需對頂層fc圖層進行微調。

就你而言,如果你有足夠的樣本,你可以微調前兩個fc層。根據我的經驗,最好先微調頂層,然後在頂層單獨完成一些迭代之後再一起微調頂層兩層。

+0

非常感謝!我在想。我有100個類別的近150萬圖像,我認爲這不是一個微不足道的數量。這會足夠多來訓練2〜3 fc層並且仍然避免過度配合嗎? – ytrewq

+0

@CosmicRabbitMediaInc看起來足以訓練整個網絡。祝你好運 – Shai

0

ConvNet中FC層的目的僅僅是爲您的問題執行分類。你可以使用最後一個Conv/Pooling層的最終平坦輸出作爲工程特徵,並將其放在另一個機器學習模型中,它會產生相同的效果。

這意味着FC層在大多數情況下獲得的參數非常具體(取決於數據),並且在大多數情況下不可轉讓。

因此,每當人們對預先訓練好的模型進行微調時,他們幾乎總是將FC層放在頂層。

現在你可以從這裏2種方式。

  1. 使用上一個Conv/Pooling層的最終平坦輸出作爲問題的提取特徵,並在其上訓練ML模型。如果您的數據集較小或與預先訓練的模型不相似,則通常使用此方法。
  2. 使用上述方法獲取提取的特徵,然後使用它們來訓練FC神經網絡。一旦你在預訓練模型的最後一個conv/pooling層(不要忘記去除orignal FC層)上達到一個體面的精確度,現在凍結(參數是固定的,不會改變訓練)大部分預先訓練的模型,只允許訓練最後幾個conv層。現在訓練整個網絡以非常小的學習速度進行訓練。

凍結大部分模型的重點在於,我們假設模型已經知道基本的東西,比如邊緣檢測和來自較早的conv層的顏色。現在我們調整最後幾層來解決我們的問題。我們選擇了一個小的學習率,這樣我們就不會搞壞模型已經學到的東西。

我們在將FC層與預先訓練好的模型相匹配之前訓練FC層的原因僅僅是爲了節省訓練時間,更重要的是確保我們不會對Conv層做出太多改變並最終結束配件。