时间:2021-05-22
在pytorch中一般只对叶节点进行梯度计算,也就是下图中的d,e节点,而对非叶节点,也即是c,b节点则没有显式地去保留其中间计算过程中的梯度(因为一般来说只有叶节点才需要去更新),这样可以节省很大部分的显存,但是在调试过程中,有时候我们需要对中间变量梯度进行监控,以确保网络的有效性,这个时候我们需要打印出非叶节点的梯度,为了实现这个目的,我们可以通过两种手段进行。
注册hook函数
Tensor.register_hook[2] 可以注册一个反向梯度传导时的hook函数,这个hook函数将会在每次计算 关于该张量 的时候 被调用,经常用于调试的时候打印出非叶节点梯度。当然,通过这个手段,你也可以自定义某一层的梯度更新方法。[3] 具体到这里的打印非叶节点的梯度,代码如:
def hook_y(grad): print(grad)x = Variable(torch.ones(2, 2), requires_grad=True)y = x + 2z = y * y * 3y.register_hook(hook_y) out = z.mean()out.backward()输出如:
tensor([[4.5000, 4.5000], [4.5000, 4.5000]])retain_grad()
Tensor.retain_grad()显式地保存非叶节点的梯度,当然代价就是会增加显存的消耗,而用hook函数的方法则是在反向计算时直接打印,因此不会增加显存消耗,但是使用起来retain_grad()要比hook函数方便一些。代码如:
x = Variable(torch.ones(2, 2), requires_grad=True)y = x + 2y.retain_grad()z = y * y * 3out = z.mean()out.backward()print(y.grad)输出如:
tensor([[4.5000, 4.5000], [4.5000, 4.5000]])以上这篇在pytorch中对非叶节点的变量计算梯度实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
pytorch中如何只让指定变量向后传播梯度?(或者说如何让指定变量不参与后向传播?)有以下公式,假如要让L对xvar求导:(1)中,L对xvar的求导将同时计
在PyTorch中可以方便的验证SoftMax交叉熵损失和对输入梯度的计算关于softmax_cross_entropy求导的过程,可以参考HERE示例:#-*
一、前情回顾8月初,淘宝针对销量问题,与广大卖家亲们做了深入沟通和交流,80%卖家支持将销量计算节点从“拍下付款”,调整为“
衡量计算机的性能指标有: 1、字长。由于计算机使用二进制,所以计算机以多少个二进制位作为信息处理单元,就成为衡量计算机性能的主要指标,如用16位二进制代表信息
淘宝拟对低价商品的评价和销量计算逻辑进行调整,具体方案如下(规则解读,点此了解)https://rule.taobao.com/detail-4149.htm?