📅  最后修改于: 2023-12-03 15:34:32.971000             🧑  作者: Mango
在 Pytorch 中,有一个名为 torch.nn.functional.dropout
的函数用于对输入张量进行 dropout 操作,但有时候我们需要在训练时关闭 dropout 操作,而在测试时启用 dropout 操作,这时我们就需要使用 torch.nn.functional.dropout
中的 training
参数来控制。然而,在一些情况下,我们不希望梯度在某个节点以下传递,这时就需要使用 torch.nn.functional.stop_gradient
。
torch.nn.functional.stop_gradient
是一个用于在计算图中止梯度传播的函数。当我们使用该函数时,自动求导系统便会停止在该节点处的梯度计算,从而防止反向传播时梯度在该节点以下传递。该函数有一个输入参数 input
,表示要中止梯度传播的节点,返回值为 input
本身。
下面我们来看一个使用 torch.nn.functional.stop_gradient
的例子。
import torch
x = torch.tensor([2., 3.], requires_grad=True)
y = torch.tensor([3., 4.], requires_grad=True)
z = (x + y).mean()
z_sg = torch.nn.functional.stop_gradient(z)
l = z_sg * x
l.backward()
print(x.grad) # tensor([0.5000, 0.5000])
在上面的代码中,我们将 z
的梯度传播中止,只计算 z
以前的梯度,从而达到在反向传播时只更新 x
的梯度,而不更新 y
的梯度的效果。
使用 torch.nn.functional.stop_gradient
可以在计算图中止梯度传播,从而达到更灵活地控制梯度计算的效果。