在训练阶段,我选择了性能指标最佳的模型参数。
if performance_metric.item()>max_performance: max_performance= performance_metric.item() torch.save(neural_net.state_dict(), PATH+'/best_model.pt')
这是使用的 neural network 模型:
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) #与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()
时,性能与选定的最佳模型参数相似。
我是否遗漏了关于 eval() 的重要方面?批量归一化是否正确使用?我在测试阶段使用了与训练阶段相同的批量大小。
回答:
在不知道您的批量大小、训练/测试数据集大小或训练/测试数据集差异的情况下,这个问题之前在 pytorch 论坛上讨论过这里。
根据我的经验,这听起来很像您的模型中的潜在训练数据表示与验证数据表示有显著差异。我能提供的主要建议是尝试降低您的批量归一化层的动量。您可以考虑用一个层归一化层替代(它不跟踪运行中的均值/标准差),或者在 batchnorm1d 函数中设置 track_running_stats=False
,然后看看问题是否依然存在。