PyTorch中不使用DataLoader单张图片预测结果异常问题求助
PyTorch单张图片预测异常问题
我尝试不使用DataLoader对单张图片进行预测,但得到了异常结果:
使用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)
我希望找到在PyTorch中不使用DataLoader对单张图片进行预测并得到正确标签的方法。

内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

