【问题标题】:Pytorch Tensors using all RAMPytorch 张量使用所有 RAM
【发布时间】:2022-01-24 23:30:48
【问题描述】:

我有一个张量列表,这对我的 RAM 来说太重了。我想将它们保存在文件系统中并在需要时加载它们

torch.save(single_tensor, 'tensor_<idx>.pt')

如果我想在训练时使用批处理,是否有在需要时自动加载张量的方法? 我在考虑使用TensorDatasetDataLoader,但是现在我在列表中没有张量,而是在文件系统中,我应该如何构建它们?

【问题讨论】:

  • 您可以使用内存映射张量。 IE。张量不是存储在 RAM 中,而是存储在磁盘上,但可以像普通张量一样访问。您可以在需要时通过索引将其复制到 RAM 中。不幸的是,文档中没有很多关于这方面的好信息,但也许 this answer 会有所帮助。
  • 不知道我理解的好不好:我创建了这个二进制文件,最初是空的。然后我遍历它并写下所有的张量。一旦我写了所有东西,我就可以把这个对象包装在一个 TensorDataset 中,对吧?
  • 我正在考虑创建一个自定义数据集类,覆盖__getitem__ 方法。在这种方法中,我将通过torch.load() 加载给定索引的张量。这可能是一个解决方案吗?
  • 是的,这可行,您可以将每个张量保存为单独的文件,并在__getitem__ 期间加载特定的张量。我建议的替代方法是创建一个大张量作为内存映射张量,然后将其提供给TensorDataset,如我链接的那个答案中所述。我提供的链接描述了如何创建内存映射张量以及如何将其作为只读 (shared=False) 张量再次加载。

标签: python pytorch


【解决方案1】:

先将张量一一保存到torch.save()归档

torch.save(tensor, 'path/to/file.pt')

那么这个Dataset 类只允许在真正需要时加载张量:

class EmbedDataset(torch.utils.data.Dataset):
    def __init__(self, first_embed_path, second_embed_path, labels):
        self.first_embed_path = first_embed_path 
        self.second_embed_path = second_embed_path 
        self.labels = labels

        

    def __len__(self):
        return len(self.labels)

    def __getitem__(self, i):

        label = self.labels[i]

        embed = torch.load(os.path.join(self.first_embed_path, str(i) + '.pt'))

        pos = torch.load(os.path.join(self.second_embed_path, str(i) + '.pt'))

        tensor = torch.cat((embed, pos))

        return tensor, label

这里的张量用数字命名,例如1.pt1816.pt

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2021-10-11
    • 1970-01-01
    • 2022-10-17
    • 2021-12-07
    • 2019-02-05
    • 1970-01-01
    • 2021-10-31
    • 2021-12-29
    相关资源
    最近更新 更多