python - 调用 storage() 方法时,Pytorch Tensor 存储具有相同的 id

标签 python memory pytorch tensor

我正在通过博客(用我的母语 - 越南语)学习张量存储,在尝试了示例之后,我发现了一些难以理解的东西。给定 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 id() 返回一个对象的标识。该 id 在该对象的生命周期内是唯一且恒定的。”来自python docu

现在在这种情况下:

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

x.storage()x_t.storage()zzz.storage() 仅在 id 期间存在() 称呼。之后,这些将被垃圾收集。换句话说,x.storage() 的 id 被释放,然后可以分配给 x_t.storage() 等等。

如果您尝试以下操作:

print(x.storage() is x_t.storage()) 

它将返回 False。由于在这种情况下,一旦打印完成,x.storage()x_t.storage()就会被垃圾回收,因此两者不可能具有相同的 id print 调用,因为它们的生命周期重叠。

现在,我认为由于某些 CPython 实现依赖于内存地址来分配 id,因此在这种情况下您会得到相同的输出:

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

但是,这并不表示您手头有与之前所示相同的对象。

这是出于相同目的的另一个示例:

class DummyClass:
    def dummyfunc(self):
        print(f"Illustration purpose")

如果您测试以下内容:

x = DummyClass()
print(id(x.dummyfunc()), id(x.dummyfunc()))

出于之前讨论的相同原因,它也会在此处返回相同的 id。

现在我们已经解释了 id,让我们看一下 data_ptr()data_ptr() 返回 self 张量的第一个元素的地址,如 official docu 中所述。 .

请注意,id 默认情况下不返回对象的内存地址,而是唯一的对象标识符。虽然,CPython 实现以某种方式使用内存地址(我不知道细节)。但是,这不应该作为一般情况的引用

为了检查两个张量是否具有相同的数据,您可以使用以下命令:

tensor_var.storage().data_ptr()

如果tensor_var1和tensor_var2具有相同的存储指针,则它们共享数据内存。

希望对您有所帮助。

关于python - 调用 storage() 方法时,Pytorch Tensor 存储具有相同的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67289617/

相关文章:

python - pytorch:无法加载 CNN 模型并进行预测 TypeError: 'collections.OrderedDict' 对象不可调用

PyTorch 不等式梯度

python - Pandas:如何交换行的单元格值,以便它们按字母顺序排列

python - PIL 可以用于获取 svg 文件的尺寸吗?

python - 如何使用此条件对我的字典进行排序

python - matplotlib 交互式绘图(在图表上手动绘制线条)

c - 将一个int值插入到一个char类型的指针中

c++ - 64 位 Windows 上应用程序可用的最大内存是多少

c - 内存中的地址空间段和程序内存段有什么区别?

python - 属性错误: 'tuple' object has no attribute 'size'