我注意到,對新數據集的CNN進行的大多數微調僅在「最後」完全連接(fc)層完成。從較低的fc層微調CNN
我對從「第一個」完全連接層進行微調感興趣:也就是說,我想使用卷積和合並圖層的中級特徵(假設它是在ImageNet上訓練的),但是將所有fc圖層適合我的新數據集。
理論上和實踐中,這是什麼效果?是否有可能爲我的新數據集學習更合適的一組參數?
我注意到,對新數據集的CNN進行的大多數微調僅在「最後」完全連接(fc)層完成。從較低的fc層微調CNN
我對從「第一個」完全連接層進行微調感興趣:也就是說,我想使用卷積和合並圖層的中級特徵(假設它是在ImageNet上訓練的),但是將所有fc圖層適合我的新數據集。
理論上和實踐中,這是什麼效果?是否有可能爲我的新數據集學習更合適的一組參數?
從理論上講,您調整得越深,模型越適合您的數據。所以,如果你可以調整整個模型 - 越好。
那麼,有什麼問題,你必須問,爲什麼不每個人都調整整個模型?首先,微調整個模型需要大量的參數,爲了適當地訓練數百萬個參數而沒有過度擬合的風險,你必須有很多新的訓練樣例。在大多數情況下,微調時,只有少數註釋樣本用於新任務,因此無法對整個模型進行微調。其次,微調整個模型花費的時間要比訓練頂層fc層要長得多。因此,如果您只有很少的時間和預算,您只需對頂層fc圖層進行微調。
就你而言,如果你有足夠的樣本,你可以微調前兩個fc層。根據我的經驗,最好先微調頂層,然後在頂層單獨完成一些迭代之後再一起微調頂層兩層。
ConvNet中FC層的目的僅僅是爲您的問題執行分類。你可以使用最後一個Conv/Pooling層的最終平坦輸出作爲工程特徵,並將其放在另一個機器學習模型中,它會產生相同的效果。
這意味着FC層在大多數情況下獲得的參數非常具體(取決於數據),並且在大多數情況下不可轉讓。
因此,每當人們對預先訓練好的模型進行微調時,他們幾乎總是將FC層放在頂層。
現在你可以從這裏2種方式。
凍結大部分模型的重點在於,我們假設模型已經知道基本的東西,比如邊緣檢測和來自較早的conv層的顏色。現在我們調整最後幾層來解決我們的問題。我們選擇了一個小的學習率,這樣我們就不會搞壞模型已經學到的東西。
我們在將FC層與預先訓練好的模型相匹配之前訓練FC層的原因僅僅是爲了節省訓練時間,更重要的是確保我們不會對Conv層做出太多改變並最終結束配件。
非常感謝!我在想。我有100個類別的近150萬圖像,我認爲這不是一個微不足道的數量。這會足夠多來訓練2〜3 fc層並且仍然避免過度配合嗎? – ytrewq
@CosmicRabbitMediaInc看起來足以訓練整個網絡。祝你好運 – Shai