pytorch 預(yù)訓(xùn)練模型讀取修改相關(guān)參數(shù)的填坑問題
pytorch 預(yù)訓(xùn)練模型讀取修改相關(guān)參數(shù)的填坑
修改部分層,仍然調(diào)用之前的模型參數(shù)。
resnet = resnet50(pretrained=False) resnet.load_state_dict(torch.load(args.predir)) res_conv31 = Bottleneck_dilated(1024, 256,dilated_rate = 2) print("---------------------",res_conv31) print("---------------------",resnet.layer3[1]) res_conv31.load_state_dict(resnet.layer3[1].state_dict())
網(wǎng)絡(luò)預(yù)訓(xùn)練模型與之前的模型對應(yīng)不上,名稱差個前綴
model_dict = model.state_dict() # print(model_dict) pretrained_dict = torch.load("/yzc/reid_testpcb/se_resnet50-ce0d4300.pth") keys = [] for k, v in pretrained_dict.items(): keys.append(k) i = 0 for k, v in model_dict.items(): if v.size() == pretrained_dict[keys[i]].size(): model_dict[k] = pretrained_dict[keys[i]] #print(model_dict[k]) i = i + 1 model.load_state_dict(model_dict)
最后是修改參數(shù)名拿來用的,
from collections import OrderedDict pretrained_dict = torch.load('premodel') new_state_dict = OrderedDict() # for k, v in mgn_state_dict.items(): # name = k[7:] # remove `module.` # new_state_dict[name] = v # self.model = self.model.load_state_dict(new_state_dict) for k, v in pretrained_dict.items(): name = "model.module."+k # remove `module.` # print(name) new_state_dict[name] = v self.model.load_state_dict(new_state_dict)
pytorch:加載預(yù)訓(xùn)練模型中的部分參數(shù),并固定該部分參數(shù)(真實有效)
大家在學(xué)習(xí)pytorch時,可能想利用pytorch進(jìn)行fine-tune,但是又煩惱于參數(shù)的加載問題。下面我將講訴我的使用心得。
Step1: 加載預(yù)訓(xùn)練模型,并去除需要再次訓(xùn)練的層
#注意:需要重新訓(xùn)練的層的名字要和之前的不同。 model=resnet()#自己構(gòu)建的模型,以resnet為例 model_dict = model.state_dict() pretrained_dict = torch.load('xxx.pkl') pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict} model_dict.update(pretrained_dict) model.load_state_dict(model_dict)
Step2:固定部分參數(shù)
#k是可訓(xùn)練參數(shù)的名字,v是包含可訓(xùn)練參數(shù)的一個實體 #可以先print(k),找到自己想進(jìn)行調(diào)整的層,并將該層的名字加入到if語句中: for k,v in model.named_parameters(): if k!='xxx.weight' and k!='xxx.bias' : v.requires_grad=False#固定參數(shù)
Step3:訓(xùn)練部分參數(shù)
#將要訓(xùn)練的參數(shù)放入優(yōu)化器 optimizer2=torch.optim.Adam(params=[model.xxx.weight,model.xxx.bias],lr=learning_rate,betas=(0.9,0.999),weight_decay=1e-5)
Step4:檢查部分參數(shù)是否固定
debug之后,程序正常運行,最好檢查一下網(wǎng)絡(luò)的參數(shù)是否真的被固定了,如何沒固定,網(wǎng)絡(luò)的狀態(tài)接近于重新訓(xùn)練,可能會導(dǎo)致網(wǎng)絡(luò)性能不穩(wěn)定,也沒辦法得到想要得到的性能提升。
for k,v in model.named_parameters(): if k!='xxx.weight' and k!='xxx.bias' : print(v.requires_grad)#理想狀態(tài)下,所有值都是False
需要注意的是,操作失誤最大的影響是,loss函數(shù)幾乎不會發(fā)生變化,一直處于最開始的狀態(tài),這很可能是因為所有參數(shù)都被固定了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python使用collections模塊的容器數(shù)據(jù)類型高效處理數(shù)據(jù)
這篇文章主要為大家介紹了python使用collections模塊的容器數(shù)據(jù)類型高效處理數(shù)據(jù)的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式
這篇文章主要介紹了使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05學(xué)會迭代器設(shè)計模式,幫你大幅提升python性能
這篇文章主要介紹了python 迭代器設(shè)計模式的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01Python Charles抓包配置實現(xiàn)流程圖解
這篇文章主要介紹了Python Charles抓包實現(xiàn)流程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09使用wxPython獲取系統(tǒng)剪貼板中的數(shù)據(jù)的教程
這篇文章主要介紹了使用wxPython獲取系統(tǒng)剪貼板中的數(shù)據(jù)的教程,wxPython是一個非常受歡迎的Python圖形庫,需要的朋友可以參考下2015-05-05