tensor的内存的理解
来源:3-3 实战tf.strings与ragged tensor

wxz123
2020-02-21
老师,我想请教一下对于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的内存地址一样吗?
写回答
1回答
-
正十七
2020-02-24
同学你好,torch我不是很特别熟,所以不一定能全部回答你的问题,我试试
detach在官方文档中的含义是:
1. 返回一个新的 从当前图中分离的 Variable。
2. 返回的 Variable 永远不会需要梯度
所以我理解detach不是你理解的in place操作,至少它返回的是另一个variable,所以id不一样。
关于第二个问题,我理解,tensor a和b中的数据是共享内存的,但是因为shape变化了,所以有些东西是不同的,比如计算梯度的方法,所以tensor a和tensor b是不一样的对象。
tensorflow中没有detach的概念,in place修改直接改数字就好了。
00
相似问题