【发布时间】:2022-01-24 23:30:48
【问题描述】:
我有一个张量列表,这对我的 RAM 来说太重了。我想将它们保存在文件系统中并在需要时加载它们
torch.save(single_tensor, 'tensor_<idx>.pt')
如果我想在训练时使用批处理,是否有在需要时自动加载张量的方法?
我在考虑使用TensorDataset 和DataLoader,但是现在我在列表中没有张量,而是在文件系统中,我应该如何构建它们?
【问题讨论】:
-
您可以使用内存映射张量。 IE。张量不是存储在 RAM 中,而是存储在磁盘上,但可以像普通张量一样访问。您可以在需要时通过索引将其复制到 RAM 中。不幸的是,文档中没有很多关于这方面的好信息,但也许 this answer 会有所帮助。
-
不知道我理解的好不好:我创建了这个二进制文件,最初是空的。然后我遍历它并写下所有的张量。一旦我写了所有东西,我就可以把这个对象包装在一个 TensorDataset 中,对吧?
-
我正在考虑创建一个自定义数据集类,覆盖
__getitem__方法。在这种方法中,我将通过torch.load()加载给定索引的张量。这可能是一个解决方案吗? -
是的,这可行,您可以将每个张量保存为单独的文件,并在
__getitem__期间加载特定的张量。我建议的替代方法是创建一个大张量作为内存映射张量,然后将其提供给TensorDataset,如我链接的那个答案中所述。我提供的链接描述了如何创建内存映射张量以及如何将其作为只读 (shared=False) 张量再次加载。