我尝试在不使用
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)
我想找到一种方法来预测
Dataloader
中没有Pytorch
的单张图像,并得到正确的预测标签