Skip to content

paddle的Dataset, DataLoader不支持返回非Tensor类数据 #77754

@PlumBlossomMaid

Description

@PlumBlossomMaid

bug描述 Describe the Bug

如题,如果是使用torch框架运行如下代码:

#from paddle.io import Dataset, DataLoader
from torch.utils.data import DataLoader, Dataset
# define a random dataset
class RandomDataset(Dataset):
    def __init__(self, num_samples):
        self.num_samples = num_samples

    def __getitem__(self, idx):
        return "a"

    def __len__(self):
        return self.num_samples

def f(d):
    return d

dataset = RandomDataset(20)

loader = DataLoader(dataset,
                    batch_size=10,
                    shuffle=True,
                    drop_last=True,
                    collate_fn=f)

for e in range(1):
    for i, j in enumerate(loader):
        print(j)

结果为

E:\code\paddleaudio补全\别的贡献计划\ECD_but_paddle>python C:\Users\15895\Desktop\functions.py
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']

E:\code\paddleaudio补全\别的贡献计划\ECD_but_paddle>

如果是把运行框架换成paddle:

from paddle.io import Dataset, DataLoader
#from torch.utils.data import DataLoader, Dataset
# define a random dataset
class RandomDataset(Dataset):
    def __init__(self, num_samples):
        self.num_samples = num_samples

    def __getitem__(self, idx):
        return "a"

    def __len__(self):
        return self.num_samples

def f(d):
    return d

dataset = RandomDataset(20)

loader = DataLoader(dataset,
                    batch_size=10,
                    shuffle=True,
                    drop_last=True,
                    collate_fn=f)

for e in range(1):
    for i, j in enumerate(loader):
        print(j)

结果为

E:\code\paddleaudio补全\别的贡献计划\ECD_but_paddle>python C:\Users\15895\Desktop\functions.py

E:\code\paddleaudio补全\别的贡献计划\ECD_but_paddle>

经过本人两个小时的debug,触发迭代终止的逻辑似乎写在C++里面了,大概是C++那边判断类型不是Tensor就给直接抛出异常了。paddle框架的DataLoader应该支持非Tensor类型数据的返回,否则将会影响众多项目的复现。

其他补充信息 Additional Supplementary Information

首当其冲的就是 https://github.com/PFCCLab/paddle_geometric 这个库
因为这个库的加载数据的逻辑是,返回一个包含自定义数据类型的列表
我滴妈呀,反正我用paddle_geometric的时候是不敢用框架内的加载逻辑了
感觉当下想要解决这个问题,最好的办法就是自己写一个DataLoader类,难绷
可惜了我又因此debug了两个小时,复现模型时时间居然主要浪费在和框架斗智斗勇这一块
总之, #77752 和这个issue如果不能想办法解决,paddle_geometric这个库就别想活了(
毕竟人家那个库的逻辑在那,要么修复框架,要么对库逻辑重构,确实没办法

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions