这是我的预测函数。有什么问题吗?预测结果不稳定,每次我在相同的数据上运行时,得到的预测结果都不同。
def predict(model, device, inputs, batch_size=1024): model = model.to(device) dataset = torch.utils.data.TensorDataset(*inputs) loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, pin_memory=False ) predictions = [] for i, batch in enumerate(loader): with torch.no_grad(): pred = model(*(item.to(device) for item in batch)) pred = pred.detach().cpu().numpy() predictions.append(pred) return np.concatenate(predictions)
回答:
正如某人所建议的,您需要通过调用
model.eval()
将模型设置为eval
模式,在您的prediction
函数之前执行此操作。
eval
模式的作用如下:
将模块设置为评估模式。
这只对某些模块有影响。请参阅特定模块的文档,了解它们在训练/评估模式下的行为细节,如果它们受到影响,例如Dropout、BatchNorm等。
当您完成预测并希望继续训练时,别忘了通过调用
model.train()
将模型重置为训练模式。
模型中有几层可能会在网络的前向传播中引入随机性。一个这样的例子是dropout层。Dropout层会随机“丢弃”p
百分比的神经元,以提高模型的泛化能力。
此外,BatchNorm(以及可能的其他自适应归一化层)会跟踪数据的统计信息,因此在train
模式或eval
模式下有不同的“行为”。