我在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]。
谢谢!
答案 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(),现在就可以用于任何大小的批处理