pytorch的leafnode理解

https://blog.csdn.net/Azahaxia/article/details/117234505

https://blog.csdn.net/byron123456sfsfsfa/article/details/92210253

设置requires_grad=True的tensor会计算梯度,但是并不会为所有requires_grad=True的tensor保存梯度。因为为了减少显存/内存占用,我们不会保存中间计算过程中产生的tensor的梯度。所以,有了叶子节点的概念。当且仅当tensor是叶子节点,且需要计算梯度时,我们才会为其保存计算的梯度,用于反向传播更新。

叶节点:对于requires_grad=False或者grad_fn=None的tensor,均视为叶子节点,即is_leaf=True

分析:对于 requires_grad = False 的 tensor 来说,我们约定俗成地把它们归为叶子张量。但其实无论如何划分都没有影响,因为张量的 is_leaf 属性只有在需要求导的时候才有意义。当 requires_grad = True 的时候,且当这个 tensor 是用户创建的时候,它才是一个叶子节点,当这个 tensor 是由其他运算操作产生的时候,它就不是一个叶子节点。

为何需要叶节点:如上所述,为了减少显存/内存占用,因为我们不想为中间计算过程产生的tensor保存梯度,即使它们的requires_grad=True(即它们需要计算梯度)。

总结:用户自建的(grad_fn=None)或者是不需计算梯度的(requires_grad=False)tensor是叶子节点。requires_grad=True的tensor节点需要计算梯度,但需要保存梯度还需要满足该tensor是叶子节点。所以说,需要保存梯度的需要满足grad_fn=Nonerequires_grad=True

你可能感兴趣的:(pytorch,pytorch,python,深度学习)