TypeError: не удается обработать этот тип данных

Попытка нанести карту значимости на изображение и создать новый набор данных

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)
и форма загрузчика с (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 mode, rawmode = _fromarray_typemap [typekey] 2646 кроме KeyError:

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

During handling of the above exception, another exception occurred:

TypeError Traceback (последний вызов последний) в ----> 1 show_images (загрузчик поезда)

в show_images (trainloader) 1 def show_images (trainloader): ----> 2 для 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 в next (self) 344 def next (self): 345 index = self._next_index () # может поднять StopIteration -> 346 data = self._dataset_fetcher.fetch (index) # может поднять StopIteration 347, если self._pin_memory: 348 data = _utils.pin_memory.pin_memory (data)

~ / venv / lib / python3.7 / site-packages / torch / utils / data / _utils / fetch.py ​​в fetch (self, возможно_batched_index) 42 def fetch (self, возможно_batched_index): 43 если self.auto_collation: --- > 44 data = [self.dataset [idx] для idx в возможно_batched_index] 45 else: 46 data = self.dataset [возможно_batched_index]

~ / venv / lib / python3.7 / site-packages / torch / utils / data / _utils / fetch.py ​​в (.0) 42 def fetch (self, возможно_batched_index): 43 если self.auto_collation: ---> 44 data = [self.dataset [idx] для idx в возможно_batched_index] 45 иначе: 46 data = self.dataset [возможно_batched_index]

~ / venv / lib / python3.7 / site-packages / torchvision / datasets / cifar.py в getitem (self, index) 120 # делаем это так, чтобы это согласовывалось со всеми другими наборами данных 121 # чтобы вернуть изображение PIL -> 122 img = Image.fromarray (img) 123 124, если self.transform не равен None:

~ / venv / lib / python3.7 / site-packages / PIL / Image.py в режиме fromarray (obj, mode) 2645, rawmode = _fromarray_typemap [typekey] 2646 за исключением KeyError: -> 2647 raise TypeError ("Невозможно обработать эти данные type ") 2648 else: 2649 rawmode = mode

TypeError: не удается обработать этот тип данных

trainloader.dataset.__getitem__

getitem набора данных CIFAR10 Количество точек данных: 50000 Корневое расположение: / mnt / 3CE35B99003D727B / input / pytorch / data Split: Train StandardTransform Transform: Compose (Resize (size = 32, interpolation = PIL.Image.BILINEAR) ToTensor ())


person Community    schedule 30.12.2019    source источник
comment
Вы уверены, что ваш dataloader хранит данные как nd.array или torch.tensor? Похоже, ваши данные хранятся как PIL.Images.   -  person Shai    schedule 30.12.2019
comment
data = trainloader.dataset.data говорит numpy.ndarray   -  person    schedule 30.12.2019
comment
Я думаю, что тип не имеет значения, просто назначьте новый набор данных каким-то образом.   -  person    schedule 30.12.2019
comment
однако ошибка, которую вы получаете, исходит от _1 _... вы уверены, что dataset.__getitem__ действительно использует dataset.data? возможно ли дополнительное представление данных? вам нужно будет посмотреть код набора данных.   -  person Shai    schedule 30.12.2019
comment
trainloader.dataset .__ getitem__ :: ‹связанный метод CIFAR10 .__ getitem__ набора данных CIFAR10 Количество точек данных: 50000 Корневое расположение: / mnt / 3CE35B99003D727B / input / pytorch / data Split: Train StandardTransform Transform: Compose (Resize (size = 32, interpolation = PIL.Image.BILINEAR) ToTensor ()) ›   -  person    schedule 30.12.2019
comment
каков был dtype dataset.data до изменения? и после? что такое dtype из sal_maps_hf?   -  person Shai    schedule 30.12.2019
comment
тип (trainloader.dataset.data) = numpy.ndarray :: type (trainloader.dataset) = torchvision.datasets.cifar.CIFAR10   -  person    schedule 30.12.2019
comment
Я проверяю оба типа, но тип тот же   -  person    schedule 30.12.2019
comment
вы проверили type, а не dtype: dataset.data.dtype и sal_maps_hf.dtype   -  person Shai    schedule 30.12.2019
comment
Кстати, почему вы не можете форматировать код в своих комментариях?   -  person Shai    schedule 30.12.2019
comment
trainloader = utilsxai.load_data_cifar10 (batch_size = 1, test = False) mask = np.random.rand (50000,32,32,3) ‹br/› trainloader.dataset.data = maskbr ‹/› для idx, (img , target) в enumerate (trainloader): img = img.squeeze () ‹br/› это даст вам ту же ошибку, попробуйте   -  person    schedule 30.12.2019
comment
не уверен, как поместить следующий формат строки в комментарий   -  person    schedule 30.12.2019
comment
не уверен, что это возможно в комментариях. но вы можете использовать `для обозначения кода   -  person Shai    schedule 30.12.2019
comment
trainloader = utilsxai.load_data_cifar10 (batch_size = 1, test = False) testloader = utilsxai.load_data_cifar10 (batch_size = 128, test = True) mask = np.random.rand (50000,32,32,3) trainloader.dataset.data = mask * trainloader.dataset.data или trainloader.dataset.data = mask for idx, (img, target) in enumerate (trainloader): что-то покажет вам ту же ошибку   -  person    schedule 30.12.2019


Ответы (1)


Ваш sal_maps_hf не np.uint8.

Основываясь на частичной информации в вопросе и в комментариях, я предполагаю, что ваша маска имеет dtype np.float (или аналогичный), и путем умножения data * sal_maps_hf ваши данные приводятся к dtype, кроме np.uint8, что позже заставляет PIL.Image генерировать исключение.

Пытаться:

trainloader.dataset.data = (data * sal_maps_hf).reshape(data.shape).astype(np.uint8)
person Shai    schedule 30.12.2019
comment
Боже, ты любил это. как вы проверяете dtype типа sal_maps_hf (sal_maps_hf) показывает только его numpy.array - person ; 30.12.2019
comment
@jakeMonk это не type, а скорее _ 2_. dtype - это тип элементов ndarray (или tensor). - person Shai; 30.12.2019
comment
Я вижу sal_maps_hf.dtype = dtype ('‹f4') - person ; 30.12.2019
comment
@jakeMonk, как и ожидалось. uint8 - очень ограничительный тип данных. Убедитесь, что данные после литья не повреждены и не подлежат ремонту для ваших нужд. - person Shai; 30.12.2019
comment
спасибо, я даже не знал, что '‹f4' это какой-то тип ... ха-ха - person ; 30.12.2019
comment
Я вижу, мне нужно больше знать о типе данных, спасибо, Шай - person ; 31.12.2019