PyTorch DataLoader可以从一个空数据集开始吗



我有一个数据集在deque缓冲区中,我想用DataLoader从中加载随机批次。缓冲区开始为空。在对缓冲区进行采样之前,数据将被添加到缓冲区。

self.buffer = deque([], maxlen=capacity)
self.batch_size = batch_size
self.loader = DataLoader(self.buffer, batch_size=batch_size, shuffle=True, drop_last=True)

但是,这会导致以下错误:

File "env/lib/python3.8/site-packages/torch_geometric/loader/dataloader.py", line 78, in __init__
super().__init__(dataset, batch_size, shuffle,
File "env/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 268, in __init__
sampler = RandomSampler(dataset, generator=generator)
File "env/lib/python3.8/site-packages/torch/utils/data/sampler.py", line 102, in __init__
raise ValueError("num_samples should be a positive integer "
ValueError: num_samples should be a positive integer value, but got num_samples=0

事实证明,RandomSampler类在初始化时检查num_samples是否为正,这导致了错误。

if not isinstance(self.num_samples, int) or self.num_samples <= 0:
raise ValueError("num_samples should be a positive integer "
"value, but got num_samples={}".format(self.num_samples))

为什么它在这里检查这一点,即使RandomSampler确实支持在运行时大小变化的数据集?

一种解决方法是使用IterableDataset,但我想使用DataLoader的shuffle功能。

你能想出一个用DataLoaderdeque的好方法吗?非常感谢!

这里的问题既不是deque的使用,也不是数据集是动态增长的。问题是,您从一个大小为零的数据集开始,这是无效的。

最简单的解决方案是从deque中的任意对象开始,然后动态删除它。

最新更新