1.在没有改变原网络结构的情况下
model = resnet50()
model = model.load_state_dict(torch.load('model.pth'))
torch.load('model.pth')会把网络参数加载到一个有序字典当中, 然后把这个有序字典传递给model.load_state_dict()。
2.在只改变原网络结构的某一层或某几层的情况下
在不同的实际需求下,我们通常要对网络结构进行修改,比如ResNet50原来对1000个类别进行分类,而我们的任务只有10类的话,我们就要修改ResNet50的全连接层。而其它层不变,这时我们就可以通过加载预训练的网络参数来加速训练过程,提高准确率。
方法1:
# 将原始网络结构与修改后网络结构相同的键值对放到一个有序字典当中,不相同的键值对则被删除
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model.state_dict()}
# 将这个有序字典传给load_state_dict
model.load_state_dict(pretrained_dict)
方法2:
model.load_state_dict(pretrained_dict, strict=False)
strict参数控制是否要求传入的有序字典是否与model的有序字典完全相同,若为False,则会加载相同的键的值,若为True,只要有一个不同的地方都会报错。
3. 在网络结构被魔改的情况下
首先说一下“魔改”的定义:网络结构得到了不同的封装,比如原网络结构是