tensor.detach() 和 tensor.data 的区别

x.data和x.detach()新分离出来的tensor的requires_grad=False,即不可求导时两者之间没有区别,但是当当requires_grad=True的时候的两者之间的是有不同:x.data不能被autograd追踪求微分,但是x.detach可以被autograd()追踪求导。

x.data

复制代码

 1 import torch
 2 a = torch.tensor([1,2,3.], requires_grad=True)
 3 out = a.sigmoid()
 4 out 
 5 ----------------------------------------------------
 6 output: tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
 7 
 8 c = out.data
 9 c
10 -----------------------------------------------------
11 output: tensor([0.7311, 0.8808, 0.9526])
12 
13 c.zero_()    # 归0化
14 out
15 ------------------------------------------------------
16 tensor([0., 0., 0.], grad_fn=<SigmoidBackward>)
17 
18 out.sum().backward()
19 a.grad
20 -------------------------------------------------------
21 output:tensor([0., 0., 0.])

 x.detach()

1 b = torch.tensor([1,2,3.], requires_grad=True)
 2 out1 = b.sigmoid()
 3 out1
 4 ------------------------------------------------------
 5 output:tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
 6 
 7 c1 = out1.detach()
 8 c1
 9 ------------------------------------------------------
10 output:tensor([0.7311, 0.8808, 0.9526])
11 
12 c1.zero_()
13 out1.sum().backward()   # 报错是是因为autograd追踪求导的时候发现数据已经发生改变,被覆盖。
14 -------------------------------------------------------
15 output: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation:

总结:

  x.data和x.detach()都是从原有计算中分离出来的一个tensor变量 ,并且都是inplace operation.在进行autograd追踪求倒时,两个的常量是相同。

  不同:.data时属性,detach()是方法。 x.data不是安全的,x.detach()是安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值