设置 .eval() 时,我的模型比设置 .train() 时表现更差

when setting .eval() my model performs worse than when I set .train()

在训练阶段,我select具有最佳性能指标的模型参数。

if performance_metric.item()>max_performance:
        max_performance= performance_metric.item()
        torch.save(neural_net.state_dict(), PATH+'/best_model.pt')

这是使用的神经网络模型:

class Neural_Net(nn.Module):
        def __init__(self, M,shape_input,batch_size):
            super(Neural_Net, self).__init__()
            self.lstm = nn.LSTM(shape_input,M)
            #self.dense1 = nn.Linear(shape_input,M)
            self.dense1 = nn.Linear(M,M) #Used with the LSTM
            torch.nn.init.xavier_uniform_(self.dense1.weight)
            self.dense2 = nn.Linear(M,M)
            torch.nn.init.xavier_uniform_(self.dense2.weight)
            self.dense3 = nn.Linear(M,1)
            torch.nn.init.xavier_uniform_(self.dense3.weight)
            self.drop   = nn.Dropout(0.7)
            self.bachnorm1 = nn.BatchNorm1d(M)
            self.relu = nn.ReLU()
            self.sigmoid = nn.Sigmoid()
            
            self.hidden_cell = (torch.zeros(1,batch_size,M),torch.zeros(1,batch_size,M))
            
        def forward(self, x):
            lstm_out, self.hidden_cell = self.lstm(x.view(1 ,len(x), -1), self.hidden_cell)
            x = self.drop(self.relu(self.dense1(self.bachnorm1(lstm_out.view(len(x), -1)))))
            x = self.drop(self.relu(self.dense2(x)))
            x = self.relu(self.dense3(x))
            return x

之后,我用最佳参数加载模型并设置评估模式:

neural_net.load_state_dict(torch.load(PATH+'/best_model.pt'))
neural_net.eval() 

结果完全随机。当我设置 train() 时,性能类似于 selected 最佳模型参数。

我忘记了 eval() 的一个重要方面?批归一化是否正确使用?我在测试阶段使用与训练阶段相同大小的批次。

在不知道您的批量大小、training/test 数据集大小或 training/test 数据集差异的情况下,此问题之前已在 pytorch 论坛上讨论过 here

根据我的经验,这听起来很像您模型中的潜在训练数据表示与您的验证数据表示有很大不同。我可以提供的主要建议是让您尝试减少 batchnorm 层的动量。可能值得替换一个 layernorm 层(它不跟踪 运行 mean/standard 偏差)或在 batchnorm1d 函数中设置 track_running_stats=False 并查看问题是否仍然存在。