我使用开箱即用的pytorch中的VGG-16网络来预测一些图像索引。我发现对于同一输入文件,如果我预测多个时间,则会得到不同的结果。这对我来说似乎违反直觉。一旦预测了权重(由于我使用的是预先训练的模型),则任何步骤都不应出现任何随机性,因此,使用相同输入文件进行的多次运行将返回相同的预测。
这是我的代码:
import torch
import torchvision.models as models
VGG16 = models.vgg16(pretrained=True)
def VGG16_predict(img_path):
transformer = transforms.Compose([transforms.CenterCrop(224),transforms.ToTensor()])
data = transformer(Image.open(img_path))
output = softmax(VGG16(data.unsqueeze(0)), dim=1).argmax().item()
return output # predicted class index
VGG16_predict(image)
答案 0 :(得分:3)
回想一下,许多模块具有训练和评估两个状态:“某些模型使用具有不同训练和评估行为的模块,例如批标准化。要在这些模式之间切换,请使用model.train()或model.eval( )(有关详细信息,请参见train()或eval()。” (https://pytorch.org/docs/stable/torchvision/models.html)
在这种情况下,分类器层包括辍学,这在训练过程中是随机的。如果您希望评估是非随机的,请运行VGG16.eval()
。