关于 PyTorch 的问题,与使用 DataLoader 相比,不使用 DataLoader 进行预测会返回不同的预测

问题描述 投票:0回答:1

我尝试在不使用

Dataloader
的情况下预测单个图像,但得到了一个奇怪的结果。

Terminal Result

这张图是我预测的结果。 使用

Dataloader
,预测结果与标签一致。 然而,当读取单个图像并进行预测时,生成的标签可能与预期不同,但预测本身仍然准确。例如,模型预测所有标签为 14,标签 3 可能为 25。

我是

Pytorch
的新手,对这个问题感到困惑。这是必须要应用Dataloader来预测吗?

以下是我的主要代码:

data_transforms = {
    'train':
    transforms.Compose([
    transforms.Resize(256),
    transforms.RandomRotation(45),
    transforms.CenterCrop(224),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomVerticalFlip(p=0.5),
    transforms.ColorJitter(brightness=0.2, contrast=0.1, saturation=0.1, hue=0.1),
    transforms.RandomGrayscale(p=0.025),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'valid': transforms.Compose([transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}
   
def loop_prediction(): # wrong label
    correct_count = 0
    size = 10
    for i in range(size):
        # random get a name from './flower_data/valid/{random_number}/*.jpg'
        rand_int = random.randint(2, 3)
        img_file_name = random.choice(os.listdir(f'./flower_data/valid/{rand_int}'))
        img_file = f'./flower_data/valid/{rand_int}/{img_file_name}'
        img = Image.open(img_file)
        # read a image and change to tensor
        transform = transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
        ])

        img = transform(img)
        img = img.unsqueeze(0)
        # print(img.shape)
        model_ft.eval()
        with torch.no_grad():
            output = model_ft(img.cuda())

            _, preds_tensor = torch.max(output, 1)
            preds = np.squeeze(preds_tensor.numpy()) if not train_on_gpu else np.squeeze(
                preds_tensor.cpu().numpy())  #

        print('Label', rand_int, ' ', 'Predict:', preds)
        if preds + 1 == rand_int:
            correct_count += 1
   
def batch_prediction(): # correct label
    image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in
                      ['train', 'valid']}
    dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True) for x in
                   ['train', 'valid']}
    dataiter = iter(dataloaders['valid'])
    images, labels = next(dataiter)
    model_ft.eval()
    print(images.shape, labels.shape)
    if train_on_gpu:
        output = model_ft(images.cuda())
    else:
        output = model_ft(images)
    _, preds_tensor = torch.max(output, 1)
    preds = np.squeeze(preds_tensor.numpy()) if not train_on_gpu else np.squeeze(preds_tensor.cpu().numpy())
    print('Label:', labels, 'Predict:', preds)

我想找到一种方法来预测

Dataloader
中没有
Pytorch
的单张图像,并得到正确的预测标签

Terminal Result

python pytorch prediction dataloader
1个回答
0
投票

我解决了这个问题。

enter image description here

标签错误的原因是读取的图像的目录顺序是按1,10,100...排序的,而不是1,2,3...而不是1,2,3...所以当我没有'如果不使用 Dataloader,它会预测标签 2 的图像为 14。我使用了一个函数来交换字典中的键和值,然后回溯预测值以找到键,我得到了正确的结果。这种方式可能不是最好的或官方的解决方案。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.