自定义数据集报错:'int' object is not iterable
收藏
class MyData(Dataset): def __init__(self, ms4, pan, label): self.train_data1 = ms4 self.train_data2 = pan self.label = label def __getitem__(self, index): image_ms4 = self.train_data1[index] image_pan = self.train_data2[index] image_label = self.label[index] return image_ms4, image_pan, image_label def __len__(self): return self.label.shape[0] train_dataset = MyData(train_x1, train_x2, train_y) test_dataset = MyData(test_x1, test_x2, test_y) batch_size = 8 train_iter = DataLoader(train_dataset, batch_size, shuffle=False, num_workers = 0) test_iter = DataLoader(test_dataset, batch_size, shuffle=False, num_workers = 0) for A, B, y in train_iter: print(A.shape, B.shape, y.shape) print(A.dtype, B.dtype, y.dtype) break
rain_x1 规模 (640, 4, 16, 16) float32
train_x2 规模 (640, 1, 16, 16) float32
train_y 规模 (640, ) int32
---------------------------------------------------------------------------TypeError Traceback (most recent call last)/tmp/ipykernel_364/901604979.py in ----> 1 for A, B, y in train_iter: 2 print(A.shape, B.shape, y.shape) #(256,1,28,28) (256) 3 print(A.dtype, B.dtype, y.dtype) 4 break /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/reader.py in __iter__(self) 424 def __iter__(self): 425 if self.num_workers == 0: --> 426 return _DataLoaderIterSingleProcess(self) 427 elif self._persistent_workers: 428 if self._iterator is None: /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/dataloader_iter.py in __init__(self, loader) 168 self._blocking_queue_capacity = 1 * len(self._places) 169 --> 170 self._init_thread() 171 self._shutdown = False 172 /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dataloader/dataloader_iter.py in _init_thread(self) 175 176 def _init_thread(self): --> 177 self._var_names = [v.name for v in self._feed_list] 178 self._shapes = [v.shape for v in self._feed_list] 179 self._dtypes = [v.dtype for v in self._feed_list] TypeError: 'int' object is not iterable
十进制到二进制
已解决
4#
回复于2021-12
DATALOADER的问题报错信息可能和实际错误不太一致。考虑到您使用for没有报错,那可以默认您的数据读取是正确的: 那么最大的可能就是数据的不一致问题,就是本来图像都是128*128,突然有一个256*128的就会报类似的错。 建议将batchsize改成1,如果没有报错,那就是该问题。 如果仍然报错,那就进一步排查数据格式的问题。 打印所有的数据类型,应该有某个数据读取不到导致错误。 希望能帮助到你,如果有效请将该答案采取为解决方案
0
收藏
请登录后评论
各路大神救救孩子吧,调了好久了
如果是for数据集,结果正常
但是DATALOADER加载dataset以后,就会报那个int的错误
DATALOADER的问题报错信息可能和实际错误不太一致。考虑到您使用for没有报错,那可以默认您的数据读取是正确的:
那么最大的可能就是数据的不一致问题,就是本来图像都是128*128,突然有一个256*128的就会报类似的错。
建议将batchsize改成1,如果没有报错,那就是该问题。
如果仍然报错,那就进一步排查数据格式的问题。
打印所有的数据类型,应该有某个数据读取不到导致错误。
希望能帮助到你,如果有效请将该答案采取为解决方案
你漏掉了一个括号:
看官网示例:
有可能是批次处理时数据不一致问题。尝试自定义dataloader的collate_fn参数,对齐批次数据格式。
检查数据类型,不要用int类型作为迭代器
看了一下没有正确回答
今天不小心遇到了,检查了几个小时没发现问题,后来和示例代码对比才发现,DataLoader函数第二个参数不是batchszie,这个和pytorch不一样,所以要给上参数名称
DataLoader(train_dataset, batch_size=batch_size, shuffle=False, num_workers = 0)
赞,就是这个原因导致的,完美解决问题