PyTorch - 获取 'TypeError: pic 应该是 PIL Image 或

PyTorch - Getting the #39;TypeError: pic should be PIL Image or ndarray. Got lt;class #39;numpy.ndarray#39;gt;#39; error(PyTorch - 获取 TypeError: pic 应该是 PIL Image 或 ndarray.得到 lt;class numpy.ndarraygt;错误)

本文介绍了PyTorch - 获取 'TypeError: pic 应该是 PIL Image 或 ndarray.得到 <class 'numpy.ndarray'>'错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到错误 TypeError: pic 应该是 PIL Image 或 ndarray.当我尝试通过 DataLoader 加载非图像数据集时得到 .torchtorchvision 的版本分别是 1.0.10.2.2.post3.Python 的版本是 3.7.1Windows 10 机器上.

代码如下:

class AndroDataset(Dataset):def __init__(self, csv_path):self.transform = transforms.Compose([transforms.ToTensor()])csv_data = pd.read_csv(csv_path)self.csv_path = csv_pathself.features = []self.classes = []self.features.append(csv_data.iloc[:, :-1].values)self.classes.append(csv_data.iloc[:, -1].values)def __getitem__(self, index):# 错误发生在这里返回 self.transform(self.features[index]), self.transform(self.classes[index])def __len__(self):返回 len(self.features)

然后我设置了加载器:

training_data = AndroDataset('android.csv')train_loader = DataLoader(数据集=training_data,batch_size=batch_size,shuffle=True)

这是完整的错误堆栈跟踪:

回溯(最近一次调用最后一次): 中的文件C:Program FilesJetBrainsPyCharm 2018.1.2helperspydevpydevd.py",第 1758 行主要的()文件C:Program FilesJetBrainsPyCharm 2018.1.2helperspydevpydevd.py",第 1752 行,在主目录中globals = debugger.run(setup['file'], None, None, is_module)文件C:Program FilesJetBrainsPyCharm 2018.1.2helperspydevpydevd.py",第 1147 行,运行中pydev_imports.execfile(file, globals, locals) # 执行脚本文件C:Program FilesJetBrainsPyCharm 2018.1.2helperspydev\_pydev_imps\_pydev_execfile.py",第 18 行,在 execfile 中exec(compile(contents+"
", file, 'exec'), glob, loc) 中的文件C:/Users/talha/Documents/PyCharmProjects/DeepAndroid/deep_test_conv1d.py",第 231 行主要的()文件C:/Users/talha/Documents/PyCharmProjects/DeepAndroid/deep_test_conv1d.py",第 149 行,在主目录中对于枚举(train_loader)中的 i,(图像,标签):文件C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchutilsdatadataloader.py",第 615 行,在 __next__ 中batch = self.collat​​e_fn([self.dataset[i] for i in index])文件C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchutilsdatadataloader.py",第 615 行,在 <listcomp>batch = self.collat​​e_fn([self.dataset[i] for i in index])文件C:/Users/talha/Documents/PyCharmProjects/DeepAndroid/deep_test_conv1d.py",第 102 行,在 __getitem__ 中返回 self.transform(self.features[index]), self.transform(self.classes[index])文件C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchvision	ransforms	ransforms.py",第 60 行,在 __call__img = t(img)文件C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchvision	ransforms	ransforms.py",第 91 行,在 __call__返回 F.to_tensor(pic)文件C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchvision	ransformsfunctional.py",第 50 行,在 to_tensor 中raise TypeError('pic 应该是 PIL Image 或 ndarray. Got {}'.format(type(pic)))TypeError: pic 应该是 PIL Image 或 ndarray.得到 

解决方案

扩展@MiriamFarber 的答案,您不能在 numpy.ndarray 对象上使用 transforms.ToTensor().您可以使用 numpy 数组转换为 torch 张量"nofollow noreferrer">torch.from_numpy() 然后将您的张量转换为所需的数据类型.

<小时>

例如:

<预><代码>>>>将 numpy 导入为 np>>>进口火炬>>>np_arr = np.ones((5289, 38))>>>torch_tensor = torch.from_numpy(np_arr).long()>>>类型(np_arr)<类'numpy.ndarray'>>>>类型(火炬张量)<类'torch.Tensor'>

I am getting the error TypeError: pic should be PIL Image or ndarray. Got <class 'numpy.ndarray'> when I try to load a non-image dataset through the DataLoader. The versions of torch and torchvision are 1.0.1, and 0.2.2.post3, respectively. Python's version is 3.7.1 on a Windows 10 machine.

Here is the code:

class AndroDataset(Dataset):
    def __init__(self, csv_path):
        self.transform = transforms.Compose([transforms.ToTensor()])

        csv_data = pd.read_csv(csv_path)

        self.csv_path = csv_path
        self.features = []
        self.classes = []

        self.features.append(csv_data.iloc[:, :-1].values)
        self.classes.append(csv_data.iloc[:, -1].values)

    def __getitem__(self, index):
        # the error occurs here
        return self.transform(self.features[index]), self.transform(self.classes[index]) 

    def __len__(self):
        return len(self.features)

And I set the loader:

training_data = AndroDataset('android.csv')
train_loader = DataLoader(dataset=training_data, batch_size=batch_size, shuffle=True)

Here is the full error stack trace:

Traceback (most recent call last):
  File "C:Program FilesJetBrainsPyCharm 2018.1.2helperspydevpydevd.py", line 1758, in <module>
    main()
  File "C:Program FilesJetBrainsPyCharm 2018.1.2helperspydevpydevd.py", line 1752, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:Program FilesJetBrainsPyCharm 2018.1.2helperspydevpydevd.py", line 1147, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:Program FilesJetBrainsPyCharm 2018.1.2helperspydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"
", file, 'exec'), glob, loc)
  File "C:/Users/talha/Documents/PyCharmProjects/DeepAndroid/deep_test_conv1d.py", line 231, in <module>
    main()
  File "C:/Users/talha/Documents/PyCharmProjects/DeepAndroid/deep_test_conv1d.py", line 149, in main
    for i, (images, labels) in enumerate(train_loader):
  File "C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchutilsdatadataloader.py", line 615, in __next__
    batch = self.collate_fn([self.dataset[i] for i in indices])
  File "C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchutilsdatadataloader.py", line 615, in <listcomp>
    batch = self.collate_fn([self.dataset[i] for i in indices])
  File "C:/Users/talha/Documents/PyCharmProjects/DeepAndroid/deep_test_conv1d.py", line 102, in __getitem__
    return self.transform(self.features[index]), self.transform(self.classes[index])
  File "C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchvision	ransforms	ransforms.py", line 60, in __call__
    img = t(img)
  File "C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchvision	ransforms	ransforms.py", line 91, in __call__
    return F.to_tensor(pic)
  File "C:Users	alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages	orchvision	ransformsfunctional.py", line 50, in to_tensor
    raise TypeError('pic should be PIL Image or ndarray. Got {}'.format(type(pic)))
TypeError: pic should be PIL Image or ndarray. Got <class 'numpy.ndarray'>

解决方案

Expanding on @MiriamFarber's answer, you cannot use transforms.ToTensor() on numpy.ndarray objects. You can convert numpy arrays to torch tensors using torch.from_numpy() and then cast your tensor to the required datatype.


Eg:

>>> import numpy as np
>>> import torch
>>> np_arr = np.ones((5289, 38))
>>> torch_tensor = torch.from_numpy(np_arr).long()
>>> type(np_arr)
<class 'numpy.ndarray'>
>>> type(torch_tensor)
<class 'torch.Tensor'>

这篇关于PyTorch - 获取 'TypeError: pic 应该是 PIL Image 或 ndarray.得到 &lt;class 'numpy.ndarray'&gt;'错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:PyTorch - 获取 'TypeError: pic 应该是 PIL Image 或