Keras 實現(xiàn)加載預訓練模型并凍結(jié)網(wǎng)絡的層
在解決一個任務時,我會選擇加載預訓練模型并逐步fine-tune。比如,分類任務中,優(yōu)異的深度學習網(wǎng)絡有很多。
ResNet, VGG, Xception等等... 并且這些模型參數(shù)已經(jīng)在imagenet數(shù)據(jù)集中訓練的很好了,可以直接拿過來用。
根據(jù)自己的任務,訓練一下最后的分類層即可得到比較好的結(jié)果。此時,就需要“凍結(jié)”預訓練模型的所有層,即這些層的權(quán)重永不會更新。
以Xception為例:
加載預訓練模型:
from tensorflow.python.keras.applications import Xception model = Sequential() model.add(Xception(include_top=False, pooling='avg', weights='imagenet')) model.add(Dense(NUM_CLASS, activation='softmax'))
include_top = False : 不包含頂層的3個全鏈接網(wǎng)絡
weights : 加載預訓練權(quán)重
隨后,根據(jù)自己的分類任務加一層網(wǎng)絡即可。
網(wǎng)絡具體參數(shù):
model.summary
得到兩個網(wǎng)絡層,第一層是xception層,第二層為分類層。
由于未凍結(jié)任何層,trainable params為:20, 811, 050
凍結(jié)網(wǎng)絡層:
由于第一層為xception,不想更新xception層的參數(shù),可以加以下代碼:
model.layers[0].trainable = False
凍結(jié)預訓練模型中的層
如果想凍結(jié)xception中的部分層,可以如下操作:
from tensorflow.python.keras.applications import Xception model = Sequential() model.add(Xception(include_top=False, pooling='avg', weights='imagenet')) model.add(Dense(NUM_CLASS, activation='softmax')) for i, layer in enumerate(model.layers[0].layers): if i > 115: layer.trainable = True else: layer.trainable = False print(i, layer.name, layer.trainable)
加載所有預訓練模型的層
若想把xeption的所有層應用在訓練自己的數(shù)據(jù),并改變分類數(shù)??梢匀缦虏僮鳎?/p>
model = Sequential()
model.add(Xception(include_top=True, weights=None, classes=NUM_CLASS))
* 如果想指定classes,有兩個條件:include_top:True, weights:None。否則無法指定classes
補充知識:如何利用預訓練模型進行模型微調(diào)(如凍結(jié)某些層,不同層設置不同學習率等)
由于預訓練模型權(quán)重和我們要訓練的數(shù)據(jù)集存在一定的差異,且需要訓練的數(shù)據(jù)集有大有小,所以進行模型微調(diào)、設置不同學習率就變得比較重要,下面主要分四種情況進行討論,錯誤之處或者不足之處還請大佬們指正。
(1)待訓練數(shù)據(jù)集較小,與預訓練模型數(shù)據(jù)集相似度較高時。例如待訓練數(shù)據(jù)集中數(shù)據(jù)存在于預訓練模型中時,不需要重新訓練模型,只需要修改最后一層輸出層即可。
(2)待訓練數(shù)據(jù)集較小,與預訓練模型數(shù)據(jù)集相似度較小時。可以凍結(jié)模型的前k層,重新模型的后n-k層。凍結(jié)模型的前k層,用于彌補數(shù)據(jù)集較小的問題。
(3)待訓練數(shù)據(jù)集較大,與預訓練模型數(shù)據(jù)集相似度較大時。采用預訓練模型會非常有效,保持模型結(jié)構(gòu)不變和初始權(quán)重不變,對模型重新訓練
(4)待訓練數(shù)據(jù)集較大,與預訓練模型數(shù)據(jù)集相似度較小時。采用預訓練模型不會有太大的效果,可以使用預訓練模型或者不使用預訓練模型,然后進行重新訓練。
以上這篇Keras 實現(xiàn)加載預訓練模型并凍結(jié)網(wǎng)絡的層就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python遞歸函數(shù)求n的階乘,優(yōu)缺點及遞歸次數(shù)設置方式
這篇文章主要介紹了python遞歸函數(shù)求n的階乘,優(yōu)缺點及遞歸次數(shù)設置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04PyQt5 QLineEdit輸入的子網(wǎng)字符串校驗QRegExp實現(xiàn)
這篇文章主要介紹了PyQt5 QLineEdit輸入的子網(wǎng)字符串校驗QRegExp實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04基于python實現(xiàn)微信收紅包自動化測試腳本(測試用例)
這篇文章主要介紹了基于python實現(xiàn)微信收紅包自動化測試腳本,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07