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

Posted

技术标签:

【中文标题】PyTorch DataLoader 可以从空数据集开始吗?【英文标题】:Can a PyTorch DataLoader start with an empty dataset? 【发布时间】:2022-01-18 22:57:45 【问题描述】:

我有一个位于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 的随机播放功能。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢,这是我现在使用的解决方法,对我来说效果很好。添加一个虚拟对象只是为了立即删除它仍然感觉很不自然。你能想到一个工程原因,为什么启动一个大小为零的数据集应该是无效的,即使它在运行时它的大小为零是有效的?我可能会就此打开一个 PyTorch 问题。

以上是关于PyTorch DataLoader 可以从空数据集开始吗?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch的Dataset与Dataloader之间的关系

PyTorch DataLoader()使用

优化pytorch DataLoader提升数据加载速度

pytorch初学笔记:DataLoader的使用

小白学习PyTorch教程五在 PyTorch 中使用 Datasets 和 DataLoader 自定义数据

pytorch中的数据导入之DataLoader和Dataset的使用介绍