pytorch 預訓練模型讀取修改相關參數(shù)的填坑
修改部分層,仍然調用之前的模型參數(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)絡預訓練模型與之前的模型對應不上,名稱差個前綴
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:加載預訓練模型中的部分參數(shù),并固定該部分參數(shù)(真實有效)
大家在學習pytorch時,可能想利用pytorch進行fine-tune,但是又煩惱于參數(shù)的加載問題。下面我將講訴我的使用心得。
Step1: 加載預訓練模型,并去除需要再次訓練的層
#注意:需要重新訓練的層的名字要和之前的不同。
model=resnet()#自己構建的模型,以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是可訓練參數(shù)的名字,v是包含可訓練參數(shù)的一個實體
#可以先print(k),找到自己想進行調整的層,并將該層的名字加入到if語句中:
for k,v in model.named_parameters():
if k!='xxx.weight' and k!='xxx.bias' :
v.requires_grad=False#固定參數(shù)
Step3:訓練部分參數(shù)
#將要訓練的參數(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)絡的參數(shù)是否真的被固定了,如何沒固定,網(wǎng)絡的狀態(tài)接近于重新訓練,可能會導致網(wǎng)絡性能不穩(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Pytorch通過保存為ONNX模型轉TensorRT5的實現(xiàn)
- pytorch_pretrained_bert如何將tensorflow模型轉化為pytorch模型
- pytorch模型的保存和加載、checkpoint操作
- PyTorch 如何檢查模型梯度是否可導
- 解決Pytorch修改預訓練模型時遇到key不匹配的情況
- PyTorch模型轉TensorRT是怎么實現(xiàn)的?