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)
存储张量数据的对象到底是什么?如何检查两个张量是否共享内存?
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。
| 归档时间: |
|
| 查看次数: |
656 次 |
| 最近记录: |