https://blog.csdn.net/qq_27825451/article/details/95498211
https://blog.csdn.net/weixin_33913332/article/details/93300411?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4.no_search_link
detach() & data()
detach()
返回一个新的tensor,是从当前计算图中分离下来的,但是仍指向原变量的存放位置,其grad_fn=None
且requires_grad=False
,得到的这个tensor永远不需要计算其梯度,不具有梯度grad,即使之后重新将它的requires_grad置为true,它也不会具有梯度grad。
注意:返回的tensor和原始的tensor共享同一内存数据。in-place
函数修改会在两个tensor上同时体现(因为它们共享内存数据),此时当要对其调用backward()
时可能会导致错误。
data()
函数和 detach()
函数功能相同,但是其不能保证in-place的安全性。
In-place 正确性检查:所有的tensor都会记录用在他们身上的 in-place operations
。如果pytorch
检测到tensor在一个Function
中已经被保存用来backward
,但是之后它又被in-place operations
修改。当这种情况发生时,在backward
的时候,pytorch
就会报错。这种机制保证了,如果你用了in-place operations
,但是在backward
过程中没有报错,那么梯度的计算就是正确的。
detach_()
detach_()
将 tensor从创建它的 graph 中分离,把它作为叶子节点,其grad_fn=None
且requires_grad=False
。同detach(),但detach_()是对本身的修改(in-place操作),而detach()则是生成了一个新的tensor。