转自:https://blog.csdn.net/DreamHome_S/article/details/85259533
1.区别
.data返回和x的相同数据tensor, 但不会加入到x的计算历史里,且require s_grad = False,这样有些时候是不安全的, 因为x.data不能被autograd追踪求微分 。.detach()返回相同数据的tensor,且requires_grad=False,但能通过in-place操作报告给autograd在进行反向传播的时候。
2.例子
.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.])
.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
综上,区别是修改后再使用是否会提示报错。