解决torch.autograd.backward中的参数问题
技术  /  管理员 发布于 7年前   151
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的梯度(对于不需要gradient tensor的variable,None是可取的)。
此函数累积leaf variables计算的梯度。你可能需要在调用此函数之前将leaf variable的梯度置零。
参数:
variables(变量的序列) - 被求微分的叶子节点,即 ys 。
grad_variables((张量,变量)的序列或无) - 对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。
retain_graph(bool,可选) - 如果为False,则用于释放计算grad的图。请注意,在几乎所有情况下,没有必要将此选项设置为True,通常可以以更有效的方式解决。默认值为create_graph的值。
create_graph(bool,可选) - 如果为True,则将构造派生图,允许计算更高阶的派生产品。默认为False。
我这里举一个官方的例子
import torchfrom torch.autograd import Variablex = Variable(torch.ones(2, 2), requires_grad=True)y = x + 2z = y * y * 3out = z.mean()out.backward()#这里是默认情况,相当于out.backward(torch.Tensor([1.0]))print(x.grad)
输出结果是
Variable containing: 4.5000 4.5000 4.5000 4.5000[torch.FloatTensor of size 2x2]
接着我们继续
x = torch.randn(3)x = Variable(x, requires_grad=True)y = x * 2while y.data.norm() < 1000: y = y * 2gradients = torch.FloatTensor([0.1, 1.0, 0.0001])y.backward(gradients)print(x.grad)
输出结果是
Variable containing: 204.8000 2048.0000 0.2048[torch.FloatTensor of size 3]
这里这个gradients为什么要是[0.1, 1.0, 0.0001]?
如果输出的多个loss权重不同的话,例如有三个loss,一个是x loss,一个是y loss,一个是class loss。那么很明显的不可能所有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中的参数问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号