tensor中的data()函數與detach()的區別
detach()和data生成的都是無梯度的純tensor,並且通過同一個tensor數據操作,是共享一塊數據內存。
import torch
t1 = torch.tensor([0,1.],requires_grad=True)
t2=t1.detach()
t3=t1.data
print(t2.requires_grad,t3.requires_grad)
---------------------------------------------
output: False, False
x.data和x.detach()新分離出來的tensor的requires_grad=False,即不可求導時兩者之間沒有區別,但是當當requires_grad=True的時候的兩者之間的是有不同:x.data不能被autograd追蹤求微分,但是x.detach可以被autograd()追蹤求導。
x.data
import torch
a = torch.tensor([1,2,3.], requires_grad=True)
out = a.sigmoid()
out
----------------------------------------------------
output: tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
c = out.data
c
-----------------------------------------------------
output: tensor([0.7311, 0.8808, 0.9526])
c.zero_() # 歸0化
out
------------------------------------------------------
tensor([0., 0., 0.], grad_fn=<SigmoidBackward>)
out.sum().backward()
a.grad
-------------------------------------------------------
output:tensor([0., 0., 0.])
x.detach()
b = torch.tensor([1,2,3.], requires_grad=True)
out1 = b.sigmoid()
out1
------------------------------------------------------
output:tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
c1 = out1.detach()
c1
------------------------------------------------------
output:tensor([0.7311, 0.8808, 0.9526])
c1.zero_()
out1.sum().backward() # 報錯是是因為autograd追蹤求導的時候發現數據已經發生改變,被覆蓋。
-------------------------------------------------------
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()是安全的。
參考:
https://zhuanlan.zhihu.com/p/83329768
https://blog.csdn.net/qq_27825451/article/details/96837905