我有一个数据集,它位于一个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
的好方法吗?非常感谢!
发布于 2021-12-15 19:27:15
这里的问题既不是deque的使用,也不是数据集是动态增长的事实。问题是,您是从大小为零的数据集开始的,这是无效的。
最简单的解决方案是从deque中的任意对象开始,然后动态地删除它。
https://stackoverflow.com/questions/70369070
复制相似问题