解决torch.autograd.backward中的参数问题
torch.autograd.backward(variables,grad_variables=None,retain_graph=None,create_graph=False)
给定图的叶子节点variables,计算图中变量的梯度和。计算图可以通过链式法则求导。如果variables中的任何一个variable是非标量(non-scalar)的,且requires_grad=True。那么此函数需要指定grad_variables,它的长度应该和variables的长度匹配,里面保存了相关variable的梯度(对于不需要gradienttensor的variable,None是可取的)。
此函数累积leafvariables计算的梯度。你可能需要在调用此函数之前将leafvariable的梯度置零。
参数:
variables(变量的序列)-被求微分的叶子节点,即ys。
grad_variables((张量,变量)的序列或无)-对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。
retain_graph(bool,可选)-如果为False,则用于释放计算grad的图。请注意,在几乎所有情况下,没有必要将此选项设置为True,通常可以以更有效的方式解决。默认值为create_graph的值。
create_graph(bool,可选)-如果为True,则将构造派生图,允许计算更高阶的派生产品。默认为False。
我这里举一个官方的例子
importtorch fromtorch.autogradimportVariable x=Variable(torch.ones(2,2),requires_grad=True) y=x+2 z=y*y*3 out=z.mean() out.backward()#这里是默认情况,相当于out.backward(torch.Tensor([1.0])) print(x.grad)
输出结果是
Variablecontaining: 4.50004.5000 4.50004.5000 [torch.FloatTensorofsize2x2]
接着我们继续
x=torch.randn(3) x=Variable(x,requires_grad=True) y=x*2 whiley.data.norm()<1000: y=y*2 gradients=torch.FloatTensor([0.1,1.0,0.0001]) y.backward(gradients) print(x.grad)
输出结果是
Variablecontaining: 204.8000 2048.0000 0.2048 [torch.FloatTensorofsize3]
这里这个gradients为什么要是[0.1,1.0,0.0001]?
如果输出的多个loss权重不同的话,例如有三个loss,一个是xloss,一个是yloss,一个是classloss。那么很明显的不可能所有loss对结果影响程度都一样,他们之间应该有一个比例。那么比例这里指的就是[0.1,1.0,0.0001],这个问题中的loss对应的就是上面说的y,那么这里的输出就很好理解了dy/dx=0.1*dy1/dx+1.0*dy2/dx+0.0001*dy3/dx。
如有问题,希望大家指正,谢谢_!
以上这篇解决torch.autograd.backward中的参数问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。