我需要保存到磁盘的~15000个3-D张量(每个尺寸为2x300x20)。我检查了两个选项: 1.一个尺寸为15000x2x300x20的大张量尺 2. 15000张张的表。
我更喜欢将它保存在一个大张量中(通过torch.save())但不幸的是,新文件在第一个选项中要大得多。这是为什么 ?是否有一种将张量保存到磁盘的有效方法? (例如,对于160个张量(而不是15000),文件在第二个选项中相对于10 MG为1.3 GB。)
答案 0 :(得分:0)
第二个选项(张量表)有一个开销,因为它包含每个2x300x20张量的标题的N(= 15,000)倍(见下文)。但是这个开销在这里可以忽略不计w.r.t.总数据量。因此,两个选项在空间方面应该大致等效。
请注意,底层存储是存档的一部分。这意味着如果由于某种原因,存储空间大于当前的张量大小,则存档将 large ,例如:
x = torch.Tensor(100000)
x[1] = 1234
x:resize(1)
torch.save("x.t7", x)
y = torch.Tensor(1)
y[1] = 1234
torch.save("y.t7", y)
此处x.t7
约为782KB,而y.t7
为119B,因为它指的是100,000个元素的基础存储。
在您的第一个选项中,您应该仔细检查您是不是在这种情况下。
-
e.g。在ASCII模式下序列化虚拟Torch张量:
$ th -e "torch.save('foo.t7', torch.Tensor{1234}, 'ascii')"
$ xxd -g1 foo.t7
00000000: 34 0a 31 0a 33 0a 56 20 31 0a 31 38 0a 74 6f 72 4.1.3.V 1.18.tor
00000010: 63 68 2e 44 6f 75 62 6c 65 54 65 6e 73 6f 72 0a ch.DoubleTensor.
00000020: 31 0a 31 0a 31 0a 31 0a 34 0a 32 0a 33 0a 56 20 1.1.1.1.4.2.3.V
00000030: 31 0a 31 39 0a 74 6f 72 63 68 2e 44 6f 75 62 6c 1.19.torch.Doubl
00000040: 65 53 74 6f 72 61 67 65 0a 31 0a 31 32 33 34 0a eStorage.1.1234.
正如您所看到的,存档包括:第一个整数(此处为4)表示type of the object,以及Torch类其他元数据(如其版本(V 1
此处)等),然后最终值(1234
此处)。