【问题标题】:img should be PIL Image. Got <class 'torch.Tensor'>img 应该是 PIL 图像。得到 <class 'torch.Tensor'>
【发布时间】:2020-06-12 12:19:10
【问题描述】:

我正在尝试遍历加载程序以检查它是否正常工作,但是给出了以下错误:

TypeError: img should be PIL Image. Got &lt;class 'torch.Tensor'&gt;

我尝试同时添加transforms.ToTensor()transforms.ToPILImage(),但它给了我一个错误,要求相反。即,使用ToPILImage(),它将要求张量,反之亦然。

# Imports here
%matplotlib inline
import matplotlib.pyplot as plt
from torch import nn, optim
import torch.nn.functional as F
import torch
from torchvision import transforms, datasets, models
import seaborn as sns
import pandas as pd
import numpy as np

data_dir = 'flowers'
train_dir = data_dir + '/train'
valid_dir = data_dir + '/valid'
test_dir = data_dir + '/test'

#Creating transform for training set
train_transforms = transforms.Compose(
[transforms.Resize(255), 
transforms.CenterCrop(224), 
transforms.ToTensor(), 
transforms.RandomHorizontalFlip(), 
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])

#Creating transform for test set
test_transforms = transforms.Compose(
[transforms.Resize(255),
transforms.CenterCrop(224), 
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],[0.229, 0.224, 0.225])])

#transforming for all data
train_data = datasets.ImageFolder(train_dir, transform=train_transforms)
test_data = datasets.ImageFolder(test_dir, transform = test_transforms)
valid_data = datasets.ImageFolder(valid_dir, transform = test_transforms)

#Creating data loaders for test and training sets
trainloader = torch.utils.data.DataLoader(train_data, batch_size = 32, 
shuffle = True)
testloader = torch.utils.data.DataLoader(test_data, batch_size=32)
images, labels = next(iter(trainloader))

如果我运行plt.imshow(images[0]),它应该可以让我简单地看到图像,如果它工作正常的话。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    transforms.RandomHorizontalFlip() 适用于 PIL.Images,而不是 torch.Tensor。在上面的代码中,您在transforms.RandomHorizontalFlip() 之前应用transforms.ToTensor(),这会产生张量。

    但是,根据官方 pytorch 文档here

    transforms.RandomHorizo​​ntalFlip() 水平翻转给定的 PIL 以给定概率随机生成图像。

    所以,只需更改上述代码中的转换顺序,如下所示:

    train_transforms = transforms.Compose([transforms.Resize(255), 
                                           transforms.CenterCrop(224),  
                                           transforms.RandomHorizontalFlip(),
                                           transforms.ToTensor(), 
                                           transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]) 
    

    【讨论】:

    • 虽然你当时可能是对的,但对于任何未来的读者来说,这已经改变了,现在也可以提供张量: > 以给定的概率水平翻转给定的图像。图像可以是 PIL Image 或 Torch Tensor"
    【解决方案2】:

    只要加上transforms.ToPILImage()转换成pil图片就可以了,例如:

    transform = transforms.Compose([
        transforms.ToPILImage(),
        transforms.Resize(255),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.RandomHorizontalFlip(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 2021-01-26
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2021-06-24
      • 2020-11-05
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多