我有一个位于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
的随机播放功能。
你能想到一个很好的方法来使用一个DataLoader
与一个deque
?非常感谢!
2条答案
按热度按时间wj8zmpe11#
这里的问题既不在于 deque 的使用,也不在于数据集是动态可增长的。问题是,你从一个大小为零的数据集开始-这是无效的。
最简单的解决方案是从deque中的任意对象开始,然后动态地删除它。
k5hmc34c2#
空数据集可以定义如下:
可以使用
shuffle=False
创建/使用加载器:迭代也很好:
shuffle=True
呢?但是,当您指定
shuffle=True
时,它会中断RandomSampler
:作为一种解决方法,您可以创建自己的采样器,并将相关的错误检查从
self.num_samples <= 0
调整为self.num_samples < 0
:然后又道:
请注意,迭代这个
loader
是不起作用的,但是我把这个问题留给读者来解决。(修复对我来说并不明显,因为Sampler
代码有点交织在一起。)一个简单的解决方法是覆盖DataLoader.__iter__
或._get_iterator
。