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;错误)
问题描述
我收到错误 TypeError: pic 应该是 PIL Image 或 ndarray.当我尝试通过
DataLoader 加载非图像数据集时得到
torch
和 torchvision
的版本分别是 1.0.1
和 0.2.2.post3
.Python 的版本是 3.7.1
在 Windows 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.collate_fn([self.dataset[i] for i in index])文件C:Users alhaDocumentsPyCharmProjectsDeepAndroidvenvlibsite-packages orchutilsdatadataloader.py",第 615 行,在 <listcomp>batch = self.collate_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.得到 <class 'numpy.ndarray'>'错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:PyTorch - 获取 'TypeError: pic 应该是 PIL Image 或


- 检查具有纬度和经度的地理点是否在 shapefile 中 2022-01-01
- ";find_element_by_name(';name';)";和&QOOT;FIND_ELEMENT(BY NAME,';NAME';)";之间有什么区别? 2022-01-01
- YouTube API v3 返回截断的观看记录 2022-01-01
- CTR 中的 AES 如何用于 Python 和 PyCrypto? 2022-01-01
- 使用公司代理使Python3.x Slack(松弛客户端) 2022-01-01
- 我如何卸载 PyTorch? 2022-01-01
- 如何使用PYSPARK从Spark获得批次行 2022-01-01
- 计算测试数量的Python单元测试 2022-01-01
- 我如何透明地重定向一个Python导入? 2022-01-01
- 使用 Cython 将 Python 链接到共享库 2022-01-01