请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

tensor的内存的理解

老师,我想请教一下对于tensor的inplace操作、tensor的内存共享以及tensor的id的理解,例如(我在torch中找的例子,感觉tensorflow也差不多吧)

import torch
a = torch.tensor([10., 5., 2., 3.], requires_grad=True)
print(a, id(a))
print(a.detach(),id(a.detach()))
a.detach()[0]=100
print(a, id(a))
print(a.detach(),id(a.detach()))

输出结果为:

tensor([10.,  5.,  2.,  3.], requires_grad=True) 1317176466240
tensor([10.,  5.,  2.,  3.]) 1317176466600
tensor([100.,   5.,   2.,   3.], requires_grad=True) 1317176466240
tensor([100.,   5.,   2.,   3.]) 1317176466456

a.detach()是inplace操作,它和a是共享内存的,但为什么id()却不一样呢?
再例如:

import torch
a = torch.tensor([10., 5., 2., 3.], requires_grad=True)
b=a.view(2,2)
b[0,0]=100
print(a)
print(b)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0,0]))

运行结果:

tensor([100.,   5.,   2.,   3.], grad_fn=<CopySlices>)
tensor([[100.,   5.],
        [  2.,   3.]], grad_fn=<AsStridedBackward>)
1923176101928
1923215241720
1923215243088
1923215243088

这里也很奇怪,为什么tensor的shape都不同,却是内存共享的呢,但即使是内存共享,id(a)和id(b)却不一样,而id(a[0])与id(b[0,0])确是一致的,那两个tensor内存共享到底是指的什么呢?不是两个tensor的内存地址一样吗?

正在回答 回答被采纳积分+3

1回答

正十七 2020-02-24 23:51:51

同学你好,torch我不是很特别熟,所以不一定能全部回答你的问题,我试试

detach在官方文档中的含义是:

1. 返回一个新的 从当前图中分离的 Variable。

2. 返回的 Variable 永远不会需要梯度

所以我理解detach不是你理解的in place操作,至少它返回的是另一个variable,所以id不一样。

关于第二个问题,我理解,tensor a和b中的数据是共享内存的,但是因为shape变化了,所以有些东西是不同的,比如计算梯度的方法,所以tensor a和tensor b是不一样的对象。

tensorflow中没有detach的概念,in place修改直接改数字就好了。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信