【问题标题】:How to get entire dataset from dataloader in PyTorch如何从 PyTorch 中的数据加载器获取整个数据集
【发布时间】:2019-12-14 15:29:08
【问题描述】:

如何从 DataLoader 加载整个数据集?我只得到一批数据集。

这是我的代码

dataloader = torch.utils.data.DataLoader(dataset=dataset, batch_size=64)
images, labels = next(iter(dataloader))

【问题讨论】:

  • image_batches, label_batches = zip(*[batch for batch in dataloader]) 能满足您的需求吗?这可能会占用大量内存和时间,具体取决于数据集的大小。

标签: python pytorch dataloader


【解决方案1】:

如果数据集是火炬Dataset,您可以设置batch_size=dataset.__len__(),否则batch_szie=len(dataset) 之类的应该可以工作。

请注意,这可能需要大量内存,具体取决于您的数据集。

【讨论】:

  • 您也可以为火炬数据集执行len(dataset)。能够做到这一点是实现-_len__() 方法的唯一目的。
【解决方案2】:

我不确定您是要在网络训练以外的其他地方使用数据集(例如检查图像)还是要在训练期间迭代批次。

遍历数据集

要么按照 Usman Ali 的回答(可能会溢出)你的记忆,要么你可以这样做

for i in range(len(dataset)): # or i, image in enumerate(dataset)
    images, labels = dataset[i] # or whatever your dataset returns

您可以编写dataset[i],因为您在Dataset 类中实现了__len____getitem__(只要它是Pytorch Dataset 类的子类)。

从数据加载器中获取所有批次

我理解您的问题的方式是您想要检索所有批次来训练网络。您应该了解iter 为您提供了数据加载器的迭代器(如果您不熟悉迭代器的概念,请参阅wikipedia entry)。 next 告诉迭代器给你下一个项目。

因此,与遍历列表的迭代器相比,数据加载器总是返回下一项。列表迭代器在某个时候停止。我假设您有一些类似的时期和每个时期的步数。那么您的代码将如下所示

for i in range(epochs):
    # some code
    for j in range(steps_per_epoch):
        images, labels = next(iter(dataloader))
        prediction = net(images)
        loss = net.loss(prediction, labels)
        ...

小心next(iter(dataloader))。如果您想遍历列表,这也可能有效,因为 Python 会缓存对象,但每次从索引 0 开始时,您最终都会得到一个新的迭代器。为了避免这种情况,将迭代器取出到顶部,如下所示:

iterator = iter(dataloader)
for i in range(epochs):
    for j in range(steps_per_epoch):
        images, labels = next(iterator)

【讨论】:

    【解决方案3】:

    另一种选择是直接获取整个数据集,而不使用数据加载器,如下所示:

    images, labels = dataset[:]
    

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 2020-10-09
      • 2023-01-05
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多