• 有关于torch.autograd.grad


    torch.autograd模块给用户提供了一个自定义求导的接口。torch.autograd.grad可以手动地将loss对某部分参数进行梯度求导,特别适用于debug和观测。

    笔者经常使用这个接口用于观测模型优化出现问题时,梯度值是否出现异常;以及用于代替tensorboard等可视化工具,快速理解复杂的计算图

    比方说下面这段代码:

    t2 = torch.autograd.grad(adv_loss,next(self.dis.parameters()),retain_graph=True)
    t3 = torch.autograd.grad(adv_loss,next(self.gen.parameters()),retain_graph=True)
    t1 = torch.autograd.grad(adv_loss,target,retain_graph=True)
    
    • 1
    • 2
    • 3

    用于观测,最终的loss是否由self.dis(model)、self.gen(model)、target(tensor)计算,进而用于判断哪些模型参与这个loss的优化。这个功能就类似于使用tensorboard可视化loss的计算过程,只不过这样更方便。

    如果在autograd的时候出现如下错误:
    在这里插入图片描述
    “...appears to not have been used in the graph”就说明,这部分模型参数、变量,并没有参与到这个loss的计算中,自然loss.backward()的时候,这部分参数也不会被优化。


    用这种技巧的时候,要注意两个参数:

    • allow_unused=False:默认False,意味着如果被求导参数不在计算图的话,会报错;如果设置为True,就算参数不在loss的计算图里,梯度也会被计算,而且必定为0。这里的话,必须设置为False,也就是如果参数不在计算图里,就会提示上述`“…appears to not have been used in the graph”的错误。

    在这里插入图片描述

    • retain_graph=True:默认为False,也就是一旦求导一次之后,计算图就会被释放;这里的话如果要观测多次autograd的结果,就必须设置为True,把计算图保留。
      在这里插入图片描述

    更多有关于torch.autograd.grad的细节,参见:
    torch官方文档

  • 相关阅读:
    webpack5 Image Minimizer减少图片体积提升打包构建速度
    循环神经网络
    C++ vector类模拟实现
    【LeetCode】54. 螺旋矩阵
    2022-7-5 随机过程之条件期望及其性质 (三)
    伦敦银现货白银走势如何应对
    宝塔站点配置
    libusb系列-006-Qt下使用libusb1.0.9源码
    HT513 I2S输入的音频功放的应用场景
    Tornado 异步性能分析
  • 原文地址:https://blog.csdn.net/weixin_43301333/article/details/128214204