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()
评估训练模型之前的模式。
当使用 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()
评估训练模型之前的模式。