当a和b引用相同的数据时,为什么a.storage()和b.storage()返回false?

Via*_*pev 5 python pytorch tensor

>>> a = torch.arange(12).reshape(2, 6)
>>> a
tensor([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]])
>>> b = a[1:, :]
>>> b.storage() is a.storage()
False
Run Code Online (Sandbox Code Playgroud)

>>> b[0, 0] = 999
>>> b, a # both tensors are changed
(tensor([[999,   7,   8,   9,  10,  11]]),
 tensor([[  0,   1,   2,   3,   4,   5],
         [999,   7,   8,   9,  10,  11]]))
Run Code Online (Sandbox Code Playgroud)

存储张量数据的对象到底是什么?如何检查两个张量是否共享内存?

Jak*_*kub 5

torch.Tensor.storage()torch.Storage每次调用时都会返回一个新实例。您可以在下面看到这一点

a.storage() is a.storage()
# False
Run Code Online (Sandbox Code Playgroud)

要将指针与基础数据进行比较,您可以使用以下命令:

a.storage().data_ptr() == b.storage().data_ptr()
# True
Run Code Online (Sandbox Code Playgroud)

这篇pytorch 论坛帖子讨论了如何确定 pytorch 张量是否共享内存。


a.data_ptr()注意和之间的区别a.storage().data_ptr()第一个返回指向张量第一个元素的指针,而第二个似乎指向基础数据(而不是切片视图)的内存地址,尽管它没有记录

知道了上面的内容,我们就可以理解为什么a.data_ptr()和 不同了b.data_ptr()。考虑以下代码:

import torch

a = torch.arange(4, dtype=torch.int64)
b = a[1:]
b.data_ptr() - a.data_ptr()
# 8
Run Code Online (Sandbox Code Playgroud)

第一个元素的地址b比第一个元素多了8个,a因为我们切片去掉了第一个元素,每个元素是8个字节(dtype是64位整数)。

如果我们使用与上面相同的代码,但使用 8 位整数数据类型,则内存地址将相差 1。