关于detach

将variable参数从网络中隔离开。保持一部分的网络参数不变。


# y=A(x), z=B(y) 求B中参数的梯度,不求A中参数的梯度
y = A(x)
z = B(y.detach())
z.backward()

我后来的疑问是,他会在optimizer那里被更新吗?
看到一个解释是“该类的step函数会将构建loss的所有的Variable的参数进行更新”
那么detach的那个变量,就不会更新了。
另一个链接https://www.jianshu.com/p/f1bd4ff84926

v_c_detached = v_c.detach()

v_c_detached这个变量是不具有grad这个属性的。而且它和v_c共享一块内存(data)。
因此,detach所做的就是,重新声明一个变量,指向原变量的存放位置,但是requires_grad为false.更深入一点的理解是,计算图从detach过的变量这里就断了, 它变成了一个leaf_node.即使之后重新将它的requires_node置为true,它也不会具有梯度.

你可能感兴趣的:(关于detach)