PyTorch:不一致的预训练 VGG 输出

PyTorch: inconsistent pretrained VGG output

当使用 torchvision.models 模块加载预训练的 VGG 网络并使用它对任意 RGB 图像进行分类时,网络的输出在每次调用之间明显不同。为什么会这样?据我了解,VGG 前向传递的任何部分都不应是不确定的。

这是一个 MCVE:

import torch
from torchvision.models import vgg16

vgg = vgg16(pretrained=True)

img = torch.randn(1, 3, 256, 256)

torch.all(torch.eq(vgg(img), vgg(img))) # result is 0, but why?

vgg16 有一个 nn.Dropout 层,在训练期间,随机 丢弃其输入的 50%。在测试期间,您应该通过将网络模式设置为 "eval" 模式来 "switch off" 此行为:

vgg.eval()
torch.all(torch.eq(vgg(img), vgg(img)))
Out[73]: tensor(1, dtype=torch.uint8)

请注意,还有其他具有随机行为和不同行为的层用于训练和评估(例如,BatchNorm). Therefore, it is important to switch to eval() 评估训练模型之前的模式。