gpt4 book ai didi

pytorch - Autograd.grad() 用于 pytorch 中的 Tensor

转载 作者:行者123 更新时间:2023-12-03 14:49:43 29 4
gpt4 key购买 nike

我想计算网络中两个张量之间的梯度。输入 X 张量(批量大小 x m)通过一组卷积层发送,这些卷积层返回并输出 Y 张量(批量大小 x n)。
我正在创建一个新的损失,我想知道 Y w.r.t. 的梯度。 X. 在 tensorflow 中的东西是这样的:tf.gradients(ys=Y, xs=X)不幸的是,我一直在用 torch.autograd.grad() 进行测试,但我不知道如何去做。我收到如下错误: “RunTimeerror: grad can be implicitly created only for scalar outputs”
如果我想知道 Y w.r.t. 的梯度,torch.autograd.grad() 中的输入应该是什么? X?

最佳答案

让我们从简单的工作示例开始,使用简单的损失函数和正则向后。我们将构建简短的计算图并对其进行一些梯度计算。

代码:

import torch
from torch.autograd import grad
import torch.nn as nn


# Create some dummy data.
x = torch.ones(2, 2, requires_grad=True)
gt = torch.ones_like(x) * 16 - 0.5 # "ground-truths"

# We will use MSELoss as an example.
loss_fn = nn.MSELoss()

# Do some computations.
v = x + 2
y = v ** 2

# Compute loss.
loss = loss_fn(y, gt)

print(f'Loss: {loss}')

# Now compute gradients:
d_loss_dx = grad(outputs=loss, inputs=x)
print(f'dloss/dx:\n {d_loss_dx}')

输出:

Loss: 42.25
dloss/dx:
(tensor([[-19.5000, -19.5000], [-19.5000, -19.5000]]),)

好的,这有效!现在让我们尝试重现错误“只能为标量输出隐式创建 grad”。如您所见,前面示例中的 loss 是一个标量。 backward()grad() 默认处理单个标量值: loss.backward(torch.tensor(1.)) 。如果您尝试传递具有更多值的张量,则会出现错误。

代码:

v = x + 2
y = v ** 2

try:
dy_hat_dx = grad(outputs=y, inputs=x)
except RuntimeError as err:
print(err)

输出:
grad can be implicitly created only for scalar outputs
因此,在使用 grad() 时需要指定 grad_outputs 参数如下:

代码:

v = x + 2
y = v ** 2

dy_dx = grad(outputs=y, inputs=x, grad_outputs=torch.ones_like(y))
print(f'dy/dx:\n {dy_dx}')

dv_dx = grad(outputs=v, inputs=x, grad_outputs=torch.ones_like(v))
print(f'dv/dx:\n {dv_dx}')

输出:

dy/dx:
(tensor([[6., 6.],[6., 6.]]),)

dv/dx:
(tensor([[1., 1.], [1., 1.]]),)

注意: 如果您使用的是 backward(),只需执行 y.backward(torch.ones_like(y))

关于pytorch - Autograd.grad() 用于 pytorch 中的 Tensor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54754153/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com