PyTorch中tensor.detach()とtensor.dataの違い


PyTorch0.4では、.dataは保持されているが、.detach()を使用することを推奨し、.dataxと同じデータtensorを返すのとは異なるが、xの計算履歴には含まれず、require s_grad = Falseは、x.dataautogradに追跡されて微分を求めることができないため、安全ではない場合がある..detach()は、同じデータのtensorを返し、requires_grad=Falseであるが、in-placeの動作によりautogradに逆伝播を行う場合に報告することができる.例:tensor.data
>>> a = torch.tensor([1,2,3.], requires_grad =True)
>>> out = a.sigmoid()
>>> c = out.data
>>> c.zero_()
tensor([ 0., 0., 0.])

>>> out                   #  out    c.zero_()  
tensor([ 0., 0., 0.])

>>> out.sum().backward()  #      
>>> a.grad                #            ,  out     
tensor([ 0., 0., 0.])

tensor.detach()
>>> a = torch.tensor([1,2,3.], requires_grad =True)
>>> out = a.sigmoid()
>>> c = out.detach()
>>> c.zero_()
tensor([ 0., 0., 0.])

>>> out                   #  out   c.zero_()   !!
tensor([ 0., 0., 0.])

>>> out.sum().backward()  #      out  ,     c.zero_()   ,    
RuntimeError: one of the variables needed for gradient
computation has been modified by an