当前位置: 首页 > 知识库问答 >
问题:

在PyTorch的数据加载器中使用带pickle数据的生成器

谢英耀
2023-03-14

我以前做过一些预处理和特征选择,我有一个pickle训练输入数据,由列表列表组成,例如(但pickle)

[[1,5,45,13], [23,256,4,2], [1,12,88,78], [-1]]
[[12,45,77,325], [23,257,5,28], [3,7,48,178], [12,77,89,99]]
[[13,22,78,89], [12,33,97], [-1], [-1]]

[-1]是一个填充标记,但我认为这并不重要。

因为这个文件有大量的千兆字节,所以我希望节省内存,并使用生成器逐行(逐列表)读取pickle。我已经找到了这个可能有用的答案。这方面的工作如下:

def yield_from_pickle(pfin):
    with open(pfin, 'rb') as fhin:
        while True:
            try:
                yield pickle.load(fhin)
            except EOFError:
                break

接下来,我希望在PyTorch(1.0.1)数据加载器中使用这些数据。根据我在其他答案中发现的,我必须向它提供一个数据集,您可以将其子集,但必须包含\uu len\uuu\uu getitem\uuu。它可能是这样的:

class TextDataset(Dataset):
    def __init__(self, pfin):
        self.pfin = pfin

    def __len__(self):
        # memory-lenient way but exhaust generator?
        return sum(1 for _ in self.yield_from_pickle())

    def __getitem__(self, index):
        # ???
        pass

    def yield_from_pickle(self):
        with open(self.pfin, 'rb') as fhin:
            while True:
                try:
                    yield pickle.load(fhin)
                except EOFError:
                    break

但我根本不确定这是否可能。我如何以合理的方式实现\uuu len\uuu\uu getitem\uuu?我不认为我用\uu len\uuuu做什么是一个好主意,因为这会耗尽发电机,我根本不知道如何在保留发电机的同时安全地实施\uuu getitem\uuuu

有更好的办法吗?总而言之,我想构建一个数据集,它可以提供给PyTorch的Dataloader(因为它具有多处理能力),但不需要将整个文件读入内存。

共有1个答案

蒋奇
2023-03-14

查看我的另一个答案,了解您的选择。

简而言之,您需要将每个样本预处理到单独的文件中,或者使用不需要完全加载到内存中进行读取的数据格式

 类似资料:
  • 我想知道使用连接到MongoDB的DataLoader是否是一件明智的事情,以及如何实现这一点。 出身背景 我在一个(本地)MongoDB中有大约2000万个文档。超过内存容量的文档太多了。我想在数据上训练一个深层次的神经网络。到目前为止,我一直在首先将数据导出到文件系统,子文件夹被命名为文档的类。但我觉得这种方法是荒谬的。如果数据库中的数据已经得到很好的维护,为什么要先导出(然后删除)。 问题1

  • PyTorch包含一个名为的包,用于加载和准备数据集。它包括两个基本功能,即和,它们有助于数据集的转换和加载。 数据集 数据集用于从给定数据集读取和转换数据点。实现的基本语法如下所述 - 用于随机播放和批量处理数据。它可用于与多处理工作程序并行加载数据。 示例:加载CSV文件 使用Python包Panda来加载csv文件。原始文件具有以下格式:(图像名称,68个标记 - 每个标记具有,坐标)。

  • 我想知道如何在Pytorch中创建一个支持多种标签类型的数据加载器。我该怎么做?

  • 我正在使用 Azure Blob 存储来存储数据,并使用装载将此数据馈送到自动加载程序。我正在寻找一种方法来允许自动加载器从任何装载加载新文件。假设我的装载中有这些文件夹: mnt/ ├─ blob_container_1 ├─ blob_container_2 当我使用 .load('/mnt/') 时,没有检测到新文件。但是当我单独考虑文件夹时,它像.load('/mnt/blob_conta

  • 对于在时间序列数据上实现PyTorch数据管道的“最佳实践”,我有点困惑。 我有一个HD5文件,我使用自定义DataLoader读取。似乎我应该返回数据样本作为一个(特征,目标)元组,每个元组的形状是(L,C),其中L是seq_len,C是通道数-即不要在数据加载器中预制批处理,只需返回一个表。 PyTorch模块似乎需要一个批处理暗淡,即。Conv1D期望(N,C,L)。 我的印象是,类将预先处

  • 我有多个数据集,每个数据集中有不同数量的图像(和不同的图像维度)。在训练循环中,我想从所有数据集中随机加载一批图像,但每个批次只包含单个数据集中的图像。例如,我有数据集A、B、C、D,每个数据集都有图像01。jpg,02。jpg,…n.jpg(其中n取决于数据集),假设批量大小为3。例如,在第一个加载的批次中,我可能会在下一个批次[D/01.jpg,D/05.jpg,D/12.jpg]中获得图像[