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 或
基础教程推荐
- 修改列表中的数据帧不起作用 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 包装空间模型 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
