【问题标题】:Pytorch Tensor storages have the same id when calling the storage() methodPytorch 张量存储在调用 storage() 方法时具有相同的 id
【发布时间】:2021-07-21 04:24:15
【问题描述】:

我正在通过博客(用我的母语 - 越南语)学习张量存储,在尝试了这些示例之后,我发现了一些难以理解的东西。给定 3 个张量 xzzzx_t,如下所示:

import torch

x = torch.tensor([[3, 1, 2],
                  [4, 1, 7]])
zzz = torch.tensor([1,2,3])
# Transpose of the tensor x 
x_t = x.t()

当我将每个张量的存储设置为对应的变量时,它们的id就互不相同了:

x_storage = x.storage()
x_t_storage = x_t.storage()
zzz_storage = zzz.storage()
print(id(x_storage), id(x_t_storage), id(zzz_storage)) 
print(x_storage.data_ptr())   
print(x_t_storage.data_ptr()) 

输出:

140372837772176 140372837682304 140372837768560
94914110126336
94914110126336

但是当我在同一个 print 语句中对每个原始张量调用 storage() 方法时,无论我尝试了多少次,所有张量都观察到相同的输出:

print(id(x.storage()), id(x_t.storage()), id(zzz.storage()))
# 140372837967904 140372837967904 140372837967904

当我将它们分别打印在不同的行上时,情况变得更加奇怪;有时他们的结果不同,有时他们的结果相同:

print(id(x.storage()))
print(id(x_t.storage()))
# Output: 
# 140372837771776
# 140372837709856

所以我的问题是,为什么在第一种情况下存储的 id 之间存在差异,而在第二种情况下观察到相同的 id? (那个 id 是从哪里来的?)。第三种情况是怎么回事?

另外,我想询问data_ptr() 的方法,因为在我在Pytorch discuss 上看到的一个问题中建议使用它而不是id,但是Pytorch 中的文档只显示没有更多细节。如果有人能给我任何/所有问题的详细答案,我会很高兴。

【问题讨论】:

    标签: python memory pytorch tensor


    【解决方案1】:

    在Pytorch讨论区和Stack Overflow上搜索后,发现张量位置的比较应该使用data_ptr()的方法(根据Python discuss in the questionthis link)(虽然不完全正确,查看第一个 Python 讨论以获得更好的比较方法)

    关于id 部分,Stack Overflow 上有很多关于这个话题的问题。我在这里看到一个question 有很多答案,可以解决上述大部分问题。我对对象的id和内存分配也有一些误解,在my recent question的评论区也得到了解答

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 2020-11-22
      • 2020-10-19
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2022-10-06
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多