Pytorch DataLoader 多个数据源

6
我是一名有用的助手,可以为您翻译文本。
我正在尝试使用Pytorch数据加载器来定义自己的数据集,但我不确定如何加载多个数据源:
我的当前代码:
class MultipleSourceDataSet(Dataset):
    def __init__ (self, json_file, root_dir, transform = None):
        with open(root_dir + 'block0.json') as f:
            self.result = torch.Tensor(json.load(f))

    self.root_dir = root_dir
    self.transform = transform

    def __len__(self):
        return len(self.result[0])

    def __getitem__ (self):
        None

数据源位于root_dir = ~/Documents/blocks/下方50个块。
由于数据集非常大,我在拆分它们并避免直接合并它们之前进行了处理。
如何将它们加载到单个数据加载器中?
2个回答

9
对于 DataLoader,你需要有一个单一的 Dataset,你的问题是你有多个 'json' 文件,而你只知道如何从每个 'json' 单独创建一个 Dataset
在这种情况下,你可以使用包含所有单一-'json' 数据集的ConcatDataset
import os
import torch.utils.data as data

class SingeJsonDataset(data.Dataset):
    # implement a single json dataset here...

list_of_datasets = []
for j in os.path.listdir(root_dir):
    if not j.endswith('.json'):
        continue  # skip non-json files
    list_of_datasets.append(SingeJsonDataset(json_file=j, root_dir=root_dir, transform=None))
# once all single json datasets are created you can concat them into a single one:
multiple_json_dataset = data.ConcatDataset(list_of_datasets)

现在你可以将连接后的数据集输入到data.DataLoader中。

4
谢谢。这是一份非常详细的解释。我的问题是,如果我将所有的 .json 文件连接起来,文件会变得过于庞大,可能最终会导致崩溃。不过,无论如何我还是会尝试这个解决方案。非常感谢! - sealpuppy
4
这个有更新吗?我也在处理多个文件,每个文件里还有多个数据点。 - SantoshGupta7
@sealpuppy,你不是要连接 json 文件,而是从它们派生出的数据集。 - Shai
@SantoshGupta7,请不要在评论中提问。 - Shai
ConcatDataset 的问题在于它无法与多进程一起使用。它会在初始化时对其中每个数据集调用 len(ds),因此最终会在主进程中加载所有数据集。 - Thomas Ahle

4
我应该将我的问题修改为两个不同的子问题:
  1. 如何在PyTorch中处理大型数据集以避免内存错误
  2. 如果我将大型数据集分成小块,如何加载多个小数据集

    对于问题1

    PyTorch DataLoader可以通过创建小批量来防止此问题。您可以在此处找到更多解释。

    对于问题2

    请参考上面Shai的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接