TypeError:无法处理此数据类型

Posted

技术标签:

【中文标题】TypeError:无法处理此数据类型【英文标题】:TypeError: Cannot handle this data type 【发布时间】:2020-04-19 02:40:37 【问题描述】:

尝试将显着性图放到图像上并制作一个新的数据集

trainloader = utilsxai.load_data_cifar10(batch_size=1,test=False)
testloader =  utilsxai.load_data_cifar10(batch_size=128, test=True)

这个 load_cifar10 是 torchvision

data = trainloader.dataset.data 

trainloader.dataset.data = (data * sal_maps_hf).reshape(data.shape)

sal_maps_hf 形状与 (50000,32,32,3) 和 trainloader 形状 与 (50000,32,32,3)

但是当我运行这个

for idx,img in enumerate(trainloader):

----------------------------------- ---------------------------- KeyError Traceback(最近一次调用 最后)~/venv/lib/python3.7/site-packages/PIL/Image.py 在 fromarray(obj, mode) 2644 typekey = (1, 1) + shape[2:], arr["typestr"] -> 2645模式,rawmode = _fromarray_typemap[typekey] 2646除了KeyError:

KeyError: ((1, 1, 3), '

在处理上述异常的过程中,又发生了一个异常:

TypeError Traceback(最近调用 最后)在 ----> 1 show_images(trainloader)

在 show_images(trainloader) 1 def show_images(trainloader): ----> 2 for idx,(img,target) in enumerate(trainloader): 3 img = img.squeeze() 4 #pritn(img) 5 img = torch.tensor(img)

~/venv/lib/python3.7/site-packages/torch/utils/data/dataloader.py 下一个(自己) 344 def 下一个(自我): 345 index = self._next_index() # 可能会引发 StopIteration --> 346 data = self._dataset_fetcher.fetch(index) # 可能会引发 StopIteration 347如果self._pin_memory: 348 数据 = _utils.pin_memory.pin_memory(数据)

~/venv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py​​ 在 fetch(self, possible_batched_index) 42 def fetch(self, possible_batched_index): 43 如果 self.auto_collat​​ion: ---> 44 个数据 = [self.dataset[idx] for idx in possible_batched_index] 45 其他: 46 数据 = self.dataset[possibly_batched_index]

~/venv/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py​​ 在 (.0) 42 def fetch(self, possible_batched_index): 43 如果 self.auto_collat​​ion: ---> 44 个数据 = [self.dataset[idx] for idx in possible_batched_index] 45 其他: 46 数据 = self.dataset[possibly_batched_index]

~/venv/lib/python3.7/site-packages/torchvision/datasets/cifar.py 在 getitem(自我,索引) 120 # 这样做是为了与所有其他数据集保持一致 121 # 返回一个 PIL 图像 --> 122 img = Image.fromarray(img) 123 124 如果 self.transform 不是 None:

~/venv/lib/python3.7/site-packages/PIL/Image.py in fromarray(obj, 模式)2645 模式,原始模式 = _fromarray_typemap[typekey] 2646,除了 KeyError: -> 2647 raise TypeError("Cannot handle this data type") 2648 else: 2649 rawmode = mode

TypeError: 无法处理此数据类型

trainloader.dataset.__getitem__

获取数据集 CIFAR10 的项 数据点数:50000 根目录:/mnt/3CE35B99003D727B/input/pytorch/data 拆分:火车 StandardTransform 转换:撰写( 调整大小(大小=32,插值=PIL.Image.BILINEAR) 到张量() )

【问题讨论】:

您确定您的dataloader 将数据存储为nd.arraytorch.tensor?您的数据似乎存储为PIL.Images。 data=trainloader.dataset.data 说 numpy.ndarray 我认为类型无关紧要,只需分配新数据集就可以了.. 但是你得到的错误来自PIL.Image...你确定dataset.__getitem__实际上使用dataset.data吗?是否有可能有额外的数据表示?您必须查看数据集的代码。 trainloader.dataset.__getitem__ :: 【参考方案1】:

您的sal_maps_hf 不是np.uint8

根据问题和 cmets 中的部分信息,我猜你的掩码是 dtype np.float(或类似的),通过乘以 data * sal_maps_hf,你的数据将被转换为 dtype 而不是 @ 987654329@ 后来使PIL.Image 抛出异常。

试试:

trainloader.dataset.data = (data * sal_maps_hf).reshape(data.shape).astype(np.uint8)

【讨论】:

天哪,你喜欢它。您如何检查 sal_maps_hf 类型(sal_maps_hf)的 dtype 仅显示其 numpy.array @jakeMonk 不是type,而是dtypedtypendarray(或tensor)的元素的“类型”。 我明白了,sal_maps_hf.dtype = dtype(' @jakeMonk 符合预期。 uint8 是一种非常严格的数据类型。确保转换后的数据没有损坏,无法根据您的需要进行修复。 我知道我应该了解更多关于数据类型的信息谢谢Shai

以上是关于TypeError:无法处理此数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Python - 重复数据删除问题:TypeError:不可散列的类型:'numpy.ndarray'

TypeError:无法将“4”解释为数据类型

Azure Databricks 将 JSON 数据写入 Parquet 文件引发错误:TypeError:无法推断类型的架构

UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“类型”

TypeError [ERR_INVALID_ARG_TYPE]:“ path”参数必须为字符串Node.JS类型

Angular 6:TypeError:无法读取未定义的属性“值”