【问题标题】:PyTorch: inconsistent pretrained VGG outputPyTorch:不一致的预训练 VGG 输出
【发布时间】:2019-09-23 23:18:38
【问题描述】:

当使用 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?

【问题讨论】:

  • (1) 尝试eval 模式:vgg.eval()。 (2) 尝试使用torch.allclose 进行比较 - 由于浮点问题,输出可能不相同但彼此非常接近。

标签: python deep-learning computer-vision pytorch torchvision


【解决方案1】:

vgg16 有一个nn.Dropout 层,在训练期间,随机丢弃其输入的 50%。在测试期间,您应该通过将网络模式设置为“评估”模式来“关闭”这种行为:

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

请注意,还有其他层具有随机行为和用于训练和评估的不同行为(例如,BatchNorm)。因此,在评估经过训练的模型之前切换到eval() 模式非常重要。

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 2020-10-13
    • 1970-01-01
    • 2021-01-31
    • 2019-09-11
    • 2018-02-20
    • 2016-11-16
    • 2019-07-31
    • 2021-04-05
    相关资源
    最近更新 更多