您好,登錄后才能下訂單哦!
這篇文章主要介紹了pytorch加載預訓練模型與自己模型不匹配如何解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇pytorch加載預訓練模型與自己模型不匹配如何解決文章都會有所收獲,下面我們一起來看看吧。
模型的參數和pth文件的參數都是有序字典(OrderedDict),把字典中的鍵轉為列表就可以在for循環里迭代找不同了。
model = ResNet18(1)
model_dict1 = torch.load('resnet18.pth')
model_dict2 = model.state_dict()
model_list1 = list(model_dict1.keys())
model_list2 = list(model_dict2.keys())
len1 = len(model_list1)
len2 = len(model_list2)
minlen = min(len1, len2)
for n in range(minlen):
if model_dict1[model_list1[n]].shape != model_dict2[model_list2[n]].shape:
err = 1
搭網絡時要對照pth文件的字典順序搭,字典順序、權重尺寸(shape)和變量命名必須與pth文件完全一致。如果僅僅是變量命名不同,可采用類似的方法對模型的權重重新賦值。
model = ResNet18(1)
model_dict1 = torch.load('resnet18.pth')
model_dict2 = model.state_dict()
model_list1 = list(model_dict1.keys())
model_list2 = list(model_dict2.keys())
len1 = len(model_list1)
len2 = len(model_list2)
minlen = min(len1, len2)
for n in range(minlen):
if model_dict1[model_list1[n]].shape != model_dict2[model_list2[n]].shape:
continue
model_dict1[model_list1[n]] = model_dict2[model_list2[n]]
model.load_state_dict(model_dict2)
完整的代碼見自己搭建resnet18網絡并加載torchvision自帶權重
model_dict1 = torch.load('yolov5.pth')
model_dict2 = model.state_dict()
model_list1 = list(model_dict1.keys())
model_list2 = list(model_dict2.keys())
len1 = len(model_list1)
len2 = len(model_list2)
m, n = 0, 0
while True:
if m >= len1 or n >= len2:
break
layername1, layername2 = model_list1[m], model_list2[n]
w1, w2 = model_dict1[layername1], model_dict2[layername2]
if w1.shape != w2.shape:
continue
model_dict2[layername2] = model_dict1[layername1]
m += 1
n += 1
model.load_state_dict(model_dict2)
如果因為模型不匹配,運行第14行語句后,可看自己情況手動對m或n加上1。
補充:pytorch的一些坑:用預訓練的vgg模型的部分層的特征報錯,如張量不匹配
#打算取VGG19的第二個全連接層的輸出,那么就需要構建一個類,這個類要包含VGG的全部卷積層,
#以及到第二個全連接層的全部網絡還有他們對應的參數
class Classification_att(nn.Module):
def __init__(self, rgb_range):
super(Classification_att, self).__init__()
self.vgg19 =models.vgg19(pretrained=True)
vgg = models.vgg19(pretrained=True).features
conv_modules = [m for m in vgg]
self.vgg_conv = nn.Sequential(*conv_modules[:37])
classfi = models.vgg19(pretrained=True).classifier
classif_modules = [n for n in classfi]
self.vgg_class = nn.Sequential(*classif_modules[:4])
vgg_mean = (0.485, 0.456, 0.406)
vgg_std = (0.229 * rgb_range, 0.224 * rgb_range, 0.225 * rgb_range)
self.sub_mean = common.MeanShift(rgb_range, vgg_mean, vgg_std)
for p in self.vgg_conv.parameters():
p.requires_grad = False
for p in self.vgg_class.parameters():
p.requires_grad = False
self.classifi = nn.Sequential(
nn.Linear(4096, 1024),
nn.ReLU(True),
nn.Linear(1024, 256),
nn.ReLU(True),
nn.Linear(256, 64),
)
def forward(self, x):
x = F.interpolate(x, size=[224, 224], scale_factor=None, mode='bilinear',
align_corners=False)
x = self.sub_mean(x)
x = self.vgg_conv(x)
x = self.vgg_class(x) #執行這部報錯,說張量不匹配
原因是因為卷積層的輸出不能直接連接全連接層,即使輸出的張量的總的大小是一致的
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
#自己的代碼沒有torch.flatten(x, 1)這步
x = torch.flatten(x, 1)
補上就好了!
關于“pytorch加載預訓練模型與自己模型不匹配如何解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“pytorch加載預訓練模型與自己模型不匹配如何解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。