我在pytorch中创建了我的模型,并且工作得非常好,但是当我只想测试一个图像时batch_size=1总是返回第二个类(在本例中是一只狗)
我尝试使用批处理进行测试>;1在所有情况下,这都有效
架构:
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,3224,224]
我试过:
resize
reshape
unsqueeze(0)
当是一个图像时,响应总是[[0.4741,0.5259]]
我的测试代码
from PIL import *
msize = 256
loader = transforms.Compose([transforms.Scale(imsize), transforms.ToTensor()])
def image_loader(image_name):
"""load image, returns cuda tensor"""
image = Image.open(image_name)
image = loader(image).float()
image = image.unsqueeze(0)
return image.cuda()
image = image_loader('Cat_Dog_data/test/cat/cat.16.jpg')
with torch.no_grad():
logits = model.forward(image)
ps = torch.exp(logits)
_, predTest = torch.max(ps,1)
print(ps) ## same value in all cases
imagen_mostrar = images[ii].to('cpu')
helper.imshow(imagen_mostrar,title=clas_perro_gato(predTest), normalize=True)
第二个测试代码
andrea_data = datasets.ImageFolder(data_dir + '/andrea', transform=test_transforms)
andrealoader = torch.utils.data.DataLoader(andrea_data, batch_size=1, shuffle=True)
dataiter = iter(andrealoader)
images, labels = dataiter.next()
images, labels = images.to(device), labels.to(device)
ps = torch.exp(model.forward(images))
_, predTest = torch.max(ps,1)
print(ps.float())
例如,如果我将批次大小更改为1,则始终返回一个张量,表示这是一只狗[0.43,0.57]
谢谢
如果你的模型是“正确的”,它只是预测一只狗,你可以得到带有
torch.argmax(output, dim=1)
的标签,不管batch
的大小无论如何,你不应该使用} 作为你的损失函数,从你的最后一层移除激活,只输出一个神经元(图像仅为狗的概率)。在您的案例中,它看起来是这样的:
LogSoftmax
作为激活,请使用^{只需运行
output > 0
即可使用上述网络选择正确的标签,并“免费”获得数值稳定性我意识到我的模型没有处于eval模式
所以我刚刚添加了model.eval(),现在就这些,适用于任何大小的批次
相关问题 更多 >
编程相关推荐