具有相同形状但存储大小不同的火炬张量

Torch Tensor with same shape but different storage size

我正在研究 GAN 模型,生成器创建了一个大小为 (3,128,128) 的张量,我用伪代码

转储了它
import torch
image = Generator(noise).clone()
tensor = image[0].detach().cpu()
torch.save(tensor, save_path)

问题是张量比相同大小的张量消耗更多的存储空间,即使它们具有相同的 shapedtype

>>> import sys
>>> import torch
>>> tensor = tensor.load(save_path)
>>> rand_t = torch.randn(tensor.shape)
>>> print(tensor.shape, rand_t.shape)
torch.Size([3, 128, 128]) torch.Size([3, 128, 128])
>>> print(tensor.dtype, rand_t.dtype)
torch.float32 torch.float32
>>> print(sys.getsizeof(tensor.storage()))
9830472
>>> print(sys.getsizeof(rand_t.storage()))
196680

我试图转储那些张量,生成器的输出占用了 9.2MB,随机张量占用了 197.4kB。我确实阅读了pytorch的文档,但一无所获。请帮我弄清楚它们之间有什么区别?

似乎直接从原始张量中提取子张量会带来整个容器。函数.clone()可以解决。示例:

>>> import sys
>>> import torch
>>> tensor = torch.randn(10,3,128,128)
>>> sys.getsizeof(tensor.storage())
1966144
>>> sub1 = tensor[0]
>>> sub1.shape
torch.Size([3, 128, 128])
>>> sys.getsizeof(sub1.storage())
1966144
>>> sub2 = tensor[0].clone()
>>> sub2.shape
torch.Size([3, 128, 128])
>>> sys.getsizeof(sub2.storage())
196672

因此,就我而言,单独克隆图像应该可以解决问题:

import torch
image = Generator(noise).clone() 
tensor = image[0].detach().clone().cpu() # using clone()
torch.save(tensor, save_path)