如何在PyTorch中测试单个图像

时间:2020-03-25 01:08:07

标签: python machine-learning deep-learning pytorch

我在pytorch中创建了模型,并且运行得非常好,但是当我只想测试一张图像时 batch_size = 1 总是返回第二个类(在这种情况下是狗)。

我试图用> 1的批次进行测试,并且在所有情况下都可行!

体系结构:

TextBox

所以我的张量是[batch,3,224,224]

我尝试过:

ListBox

当一张图像时的响应始终为[[0.4741,0.5259]]

我的测试代码

ListBox

第二个测试代码

model = models.densenet121(pretrained=True)

for param in model.parameters():
param.requires_grad = False
from collections import OrderedDict
classifier = nn.Sequential(OrderedDict([
                          ('fc1', nn.Linear(1024, 500)),
                          ('relu', nn.ReLU()),
                          ('fc2', nn.Linear(500, 2)),
                          ('output', nn.LogSoftmax(dim=1))
                          ]))

model.classifier = classifier

如果我将batch_size更改为1,则始终返回一个张量,该张量说是例如狗[0.43,0.57]。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果模型“正确”,它只是预测了一条狗,无论torch.argmax(output, dim=1)的大小如何,您都可以使用batch获得标签。

无论如何,您不应使用LogSoftmax作为激​​活,请使用torch.nn.BCEWithLogitsLoss作为损失函数,并从最后一层中删除激活,并且仅输出一个神经元(图像仅是狗的概率)。在您的情况下看起来像这样:

classifier = nn.Sequential(
    OrderedDict(
        [
            ("fc1", nn.Linear(1024, 500)),
            ("relu", nn.ReLU()),
            ("fc2", nn.Linear(500, 1)),
            # See? No activation needed
        ]
    )
)

只需运行output > 0,就可以在上述网络上使用正确的标签,并且“免费”获得数值稳定性。

答案 1 :(得分:0)

我意识到我的模型不在 eval 模式下。

所以我刚刚添加了 model.eval(),现在就可以用于任何大小的批处理