Python 为什么在pytorch中保存和加载模型权重后会得到不同的结果?

Python 为什么在pytorch中保存和加载模型权重后会得到不同的结果?,python,python-3.x,pytorch,Python,Python 3.x,Pytorch,我写了一个模型,架构如下: CNNLSTM( (cnn):CNNText( (嵌入):嵌入(19410300,padding_idx=0) (convs1):模块列表( (0):Conv2d(1,32,内核大小=(3300),步幅=(1,1)) (1) :Conv2d(1,32,内核大小=(5300),步幅=(1,1)) (2) :Conv2d(1,32,内核大小=(7300),步幅=(1,1)) )

我写了一个模型,架构如下:

CNNLSTM(
(cnn):CNNText(
(嵌入):嵌入(19410300,padding_idx=0)
(convs1):模块列表(
(0):Conv2d(1,32,内核大小=(3300),步幅=(1,1))
(1) :Conv2d(1,32,内核大小=(5300),步幅=(1,1))
(2) :Conv2d(1,32,内核大小=(7300),步幅=(1,1))
)                                                                                                                                                                                     
(辍学):辍学(p=0.6)
(fc1):线性(输入特征=96,输出特征=1,偏差=真)
)                                                                                                                                                                                       
(lstm):RNN(
(嵌入):嵌入(19410300,padding_idx=0)
(rnn):LSTM(300、150,批次_第一个=真,双向=真)
(注意):注意(
(密集):线性(输入特征=300,输出特征=1,偏差=真)
(谭):谭()
(softmax):softmax()
)                                                                                                                                                                                     
(fc1):线性(输入特征=300,输出特征=50,偏差=真)
(辍学):辍学(p=0.5)
(fc2):线性(输入特征=50,输出特征=1,偏差=True)
)                                                                                                                                                                                       
(fc1):线性(输入特征=146,输出特征=1,偏差=真)
)
我在同一个数据集上使用了不同的RNN和CNN,并保存了权重。在混合模型中,我使用以下函数加载权重:

def load\u pretrained\u权重(self,model='cnn',path=None):
如果模型不在['cnn','rnn']中:
raise AttributeError(“模型必须为rnn或cnn”)
如果模型==“cnn”:
self.cnn.load\u state\u dict(火炬加载(路径))
如果模型=='rnn':
自我第一次加载状态指令(火炬加载(路径))
并使用以下功能冻结子模块:

def冻结(自):
对于self.cnn.parameters()中的p:
p、 需要_grad=False
对于self.lstm.parameters()中的p:
p、 需要_grad=False
然后对模型进行训练,与训练后的各子模块相比,得到了更好的结果 单独评估。 我在epoch循环中使用了提前停止技术来保存最佳参数。 训练后,我为同一个类创建了一个新实例,当我加载保存的“最佳”参数时,我没有得到类似的结果。 我在每个子模块(这里是RNN和CNNText)上都做了同样的尝试,效果很好。但在这种情况下,它并没有提供相同的性能

请帮我理解这里发生了什么。我不熟悉深度学习的概念。 多谢各位

我尝试了几个实验:

  • 我装上了救下的小薇
    model.load_pretrained_weights('rnn', 'models/bilstm_2_atten.pth')
    model.load_pretrained_weights('cnn', 'models/cnn2.pth')
    
    model.freeze()
    
    torch.save(model.state_dict(),path)
    
    state_dict = torch.load(MODEL_PATH)
    model.load_state_dict(state_dict)