Pytorch内存模型:“ torch.from_numpy()”如何工作?

问题描述 投票:3回答:1

我想深入了解torch.from_numpy()的工作原理。

import numpy as np
import torch

arr = np.zeros((3, 3), dtype=np.float32)
t = torch.from_numpy(arr)
print("arr: {0}\nt: {1}\n".format(arr, t))

arr[0,0]=1
print("arr: {0}\nt: {1}\n".format(arr, t))

print("id(arr): {0}\nid(t): {1}".format(id(arr), id(t)))

输出看起来像这样:

arr: [[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
t: tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

arr: [[1. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
t: tensor([[1., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

id(arr): 2360964353040
id(t): 2360964352984

这是torch.from_numpy()中文档的一部分:

from_numpy(ndarray)->张量

从:class:Tensor创建一个:class:numpy.ndarray

返回的张量和:attr:ndarray 共享相同的内存。修改张量将反映在:attr:ndarray中,反之亦然。返回的张量不可调整大小。

这是来自id()的文档:

返回对象的标识。

这在同时存在的对象中保证是唯一的。(CPython使用对象的内存地址。

所以问题来了:由于ndarray arr和张量t共享相同的内存,为什么它们具有不同的内存地址?

有什么想法/建议吗?

numpy pytorch shared-memory
1个回答
0
投票

是,tarr是不同的Python对象,位于不同的内存区域(因此,不同的id),但是都指向包含数据的同一内存地址(连续(通常为C)数组)。

© www.soinside.com 2019 - 2024. All rights reserved.