bug描述 Describe the Bug
bug描述
paddle.io.Dataloader使用自定义的collate_fn,返回数据为list时,即使 len(loader)>0
,Dataloader迭代也会直接结束,,且未抛出异常。
修复建议
调试定位到 paddle/fluid/dataloader/flat.py中的_flatten_batch()函数无法正确处理数组类型
复现代码
from paddle.io import DataLoader, Dataset
class DataDummy(Dataset):
def __init__(self):
self.data = [(1, 2, 3) for _ in range(300)]
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx]
def collate_fn(self, batch):
# # 可正常运行
# data = paddle.to_tensor([s[0] for s in batch]), paddle.to_tensor([s[1] for s in batch]), paddle.to_tensor([s[2] for s in batch])
# BUG: 无法正常获取数据,且没有抛出任何异常, 调试定位到paddle/fluid/dataloader/flat.py中的_flatten_batch函数无法正确处理数组类型
data = [s[0] for s in batch], [s[1] for s in batch], [s[2] for s in batch]
return data
if __name__ == "__main__":
ds = DataDummy()
datad = DataLoader(ds, batch_size=128, collate_fn=ds.collate_fn)
print("len(datad) =", len(datad))
read = []
for i, batch in enumerate(datad):
read.append(batch)
print("实际读取batch数量 = ", len(read))
其他补充信息 Additional Supplementary Information
- No response*
5条答案
按热度按时间js4nwp541#
您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看 官网API文档 、 常见问题 、 历史Issue 、 AI社区 来寻求解答。祝您生活愉快~
Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the API , FAQ , Github Issue and AI community to get the answer.Have a nice day!
axr492tv2#
你好,你dataset返回的数据格式是怎么样的
ruyhziif3#
你好,你dataset返回的数据格式是怎么样的
就是和bug描述复现代码一样,collate_fn返回的数据为([1,1,1...], [2,2,2...], [3,3,3...])。我给的复现代码是可以直接运行复现的。
lnlaulya4#
请问是否解决了呢,我的
collate_fn
返回的是自定义类型,也不能够遍历dataloader。z4bn682m5#
我是把collate_fn返回的list数据类型, 改成numpy之后可以正常运行了。具体的原因你可以看
from paddle.fluid.dataloader.flat import _flatten_batch
这个函数。但是这里的实现也比较混乱,我还没有完全看懂要怎么才一定能正常运行。