output.grad即使在丢失后也无。backward()

2024-04-25 17:20:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我很困惑

我的模型输出: tensor([[0.0000,0.1537],...],grad_fn=<ReluBackward0>)

如果我使用print(output.grad),它会给我None,但即使在使用 loss.backward()我得到了同样的结果,同样是None

即使 with torch.set_grad_enabled(True): 补充说,还是一样

我现在尝试了多种型号的变体,总是一样的

我用我的模型取得了很好的效果,似乎没有问题,现在我看到了这一点,我不确定是否有一个我至今没有认识到的重大缺陷。 但是我的模型在学习,它在改进,所以我想它必须要改进吗

为什么我得到的是一个实际值而不是一个零


Tags: 模型nonetrueoutputwithenabledtorchfn
1条回答
网友
1楼 · 发布于 2024-04-25 17:20:02

因为渐变只存储在叶张量的.grad属性上,所以得到的是None。这些张量在计算图中没有父张量

可以使用^{}检查张量是否为叶:

>>> x = torch.FloatTensor([1,2,3])
>>> x.requires_grad = True
>>> x.sum().backward() # backward pass

>>> x.is_leaf
True
>>> x.grad
tensor([1., 1., 1.])

您打印的张量显示grad_fn=<ReluBackward0>,表明它是ReLU层的结果,因此不是叶张量

下面是一个非叶张量的示例:

>>> x = torch.FloatTensor([1,2,3])
>>> x.requires_grad=True
>>> z = x.sum()
>>> z.backward()

>>> z.is_leaf
False
>>> z.grad
None

请注意z将显示为tensor(6., grad_fn=<SumBackward0>)


实际访问.grad将发出警告:

UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the gradient for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead.

如果要访问非叶张量上的渐变,请遵循警告消息:

>>> z.retain_grad()
>>> z = x.sum()
>>> z.retain_grad()
>>> z.backward()

>>> z.is_leaf
False
>>> z.grad
tensor(1.)

相关问题 更多 >

    热门问题