Как проверить одно изображение в pytorch - PullRequest
0 голосов
/ 25 марта 2020

Я создал свою модель в 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, 3, 224, 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())

Если я изменил свой batch_size на 1, всегда возвращался тензор, который скажет, что это собака [0.43,0.57], например.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Я понял, что моя модель не была в режиме eval .

Так что я просто добавил model.eval () и теперь все, работает для любого размер партии

0 голосов
/ 25 марта 2020

Если ваша модель «правильная», она просто предсказывает собаку, вы можете получить метку с 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 +, и вы получите числовую стабильность "бесплатно".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...