Machine learning 什么';在Pytorch中加载两个部分来自state dict的预训练模型的最佳方法是什么?

Machine learning 什么';在Pytorch中加载两个部分来自state dict的预训练模型的最佳方法是什么?,machine-learning,deep-learning,pytorch,pre-trained-model,Machine Learning,Deep Learning,Pytorch,Pre Trained Model,我试图加载除最后一层之外的两个单独训练的模型,并希望结合这两个模型分别训练最后一层。我定义了一个新的nn.Module类,并将这些预训练模型加载到该类中,然后在前进路径中尝试返回最后一层之前的值 class New_net(nn.Module): def __init__(self): super(New_net, self).__init__() self.net1 = net1() self.net2 = net2()

我试图加载除最后一层之外的两个单独训练的模型,并希望结合这两个模型分别训练最后一层。我定义了一个新的
nn.Module
类,并将这些预训练模型加载到该类中,然后在前进路径中尝试返回最后一层之前的值

class New_net(nn.Module):
    def __init__(self):
        super(New_net, self).__init__()
        self.net1 = net1()
        self.net2 = net2()
        self.fc= nn.Linear(512, 2)
        self._initialize_weights()

    def _initialize_weights(self):
        checkpoint = torch.load('save_model/checkpoint_net1.t7')
        self.net1.load_state_dict(checkpoint['state_dict'])

        checkpoint = torch.load('save_model/checkpoint_net2.t7')
        self.net2.load_state_dict(checkpoint['state_dict'])       

    def forward(self, x):
        x1 = self.net1(x)
        x2 = self.net2(x)
        x=torch.cat((x1,x2),dim=1)
        x=self.fc(x)
        return x

但它似乎没有准确加载模型。正确的方法是什么?我想。我没有初始化权重,而是执行了以下操作

#load net1 model partially
checkpoint = torch.load('save_model/checkpoint_net1.t7')
pretrained_dict=checkpoint['state_dict']

net1_dict=net.net1.state_dict()
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in net1_dict}
net1_dict.update(pretrained_dict)
net.net1.load_state_dict(net1_dict)

#load net2 model partially
checkpoint = torch.load('save_model/checkpoint_net2.t7')
pretrained_dict=checkpoint['state_dict']
net2_dict=net.net2.state_dict()
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in net2_dict}
net2_dict.update(pretrained_dict)
net.net2.load_state_dict(net2_dict)

加载所有层的权重,然后对model.parameters()中的param执行
:param.requires_grad=False
,并使用model.fc=nn.Linear(512,2)再次使用非冻结参数替换最后一层