PyTorch在backward时自动抛弃中间变量梯度的解决办法

希望以后可以一直注意到这个问题,就是PyTorch的图在进行backward的时候是不保存中间变量的grad的,因此在之后用.grad去查看梯度来检查梯度传播是无效的。这个问题,也可参见why-cant-i-see-grad-of-an-intermediate-variable中提出的详细例子。
那如何能够查看中间变量的梯度呢?Adam Paszke在这个问题底下又给出了一个简短而有用的例子,具体如下:

grads = {}
def save_grad(name):
    def hook(grad):
        grads[name] = grad
    return hook

x = Variable(torch.randn(1,1), requires_grad=True)
y = 3*x
z = y**2

# In here, save_grad('y') returns a hook (a function) that keeps 'y' as name
y.register_hook(save_grad('y'))
z.register_hook(save_grad('z'))
z.backward()

print(grads['y'])
print(grads['z'])

主要是通过hook机制,使得PyTorch图在进行backward的时候触发保存下中间变量的grad。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方所有教程的地址:pytorch.org/tutorials 以下是基于实例来入门pytorch Learnin...
    MiracleJQ阅读 1,839评论 0 4
  • 作者:Soumith Chintala 官方60分钟快速入门翻译 Github 地址简书地址CSDN地址 本教程的...
    MaosongRan阅读 25,865评论 0 35
  • 每过一段时间,总会有一个python库被开发出来,改变深度学习领域。而PyTorch就是这样一个库。 在过去的几周...
    AiTechYun阅读 4,060评论 0 4
  • 五律.年味 文/心儿 黔北小村庄,张灯结彩忙。 街边惊竹爆,店内品茶香。 土灶鱼虾煮,新楼联对妆。 寺庵人不断,祈...
    张心儿阅读 754评论 5 13
  • 那天外出办事,等了半天没有公交车,呼叫了滴滴快车,往往就是这样,刚有司机接单,公交车就来了,想想也算了,没有取消...
    童小咪阅读 180评论 2 2