pytorch中张量的Autograd.grad()

pytorch中张量的Autograd.grad(),pytorch,autograd,Pytorch,Autograd,我想计算网络中两个张量之间的梯度。输入X张量(批量X m)通过一组卷积层发送,这些卷积层返回并输出Y张量(批量X n) 我正在创建一个新的损耗,我想知道Y w.r.t.X的梯度。在tensorflow中,会是这样的: tf.梯度(ys=Y,xs=X) 不幸的是,我一直在使用torch.autograd.grad()进行测试,但我不知道如何做。我得到了如下错误:“RunTimeerror:grad只能隐式地为标量输出创建” 如果我想知道Y w.r.t.X的梯度,那么torch.autograd.g

我想计算网络中两个张量之间的梯度。输入X张量(批量X m)通过一组卷积层发送,这些卷积层返回并输出Y张量(批量X n)

我正在创建一个新的损耗,我想知道Y w.r.t.X的梯度。在tensorflow中,会是这样的:

tf.梯度(ys=Y,xs=X)

不幸的是,我一直在使用
torch.autograd.grad()
进行测试,但我不知道如何做。我得到了如下错误:
“RunTimeerror:grad只能隐式地为标量输出创建”

如果我想知道Y w.r.t.X的梯度,那么
torch.autograd.grad()中的输入应该是什么?

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

代码:

导入火炬
来自torch.autograd进口级
导入torch.nn作为nn
#创建一些虚拟数据。
x=火炬。一(2,2,需要_grad=True)
gt=火炬,像(x)*16-0.5“地面真相”
#我们将以MSELoss为例。
损失_fn=nn.MSELoss()
#做一些计算。
v=x+2
y=v**2
#计算损失。
损失=损失_fn(y,gt)
打印(f'Loss:{Loss}')
#现在计算渐变:
d_损耗_dx=梯度(输出=损耗,输入=x)
打印(f'dloss/dx:\n{d_loss_dx})
输出:

损失:42.25
dloss/dx:
(张量([-19.5000,-19.5000],-19.5000,-19.5000]),)
好的,这个有用!现在,让我们尝试重现错误“grad只能隐式地为标量输出创建”。正如您所注意到的,前面示例中的损失是一个标量
backward()
grad()
默认处理单个标量值:
loss.backward(torch.tensor(1.))
。如果你试图用更多的值传递张量,你会得到一个错误

代码:

v=x+2
y=v**2
尝试:
dy_hat_dx=grad(输出=y,输入=x)
除RuntimeError作为错误外:
打印(错误)
输出:

grad只能为标量输出隐式创建

因此,在使用
grad()
时,需要指定
grad\u输出
参数,如下所示:

代码:

v=x+2
y=v**2
dy_dx=grad(输出=y,输入=x,grad_输出=torch.one像(y))
打印(f'dy/dx:\n{dy_dx})
dv_dx=梯度(输出=v,输入=x,梯度输出=torch.ones_like(v))
打印(f'dv/dx:\n{dv_dx})
输出:

dy/dx:
(张量([6,6.],[6,6.]),)
dv/dx:
(张量([1,1.],[1,1.]),)
注意:如果您使用的是
backward()
,只需执行
y.backward(torch.one_u喜欢(y))

可能的重复