萝小卜与花小生 2024-04-29 22:27 采纳率: 50%
浏览 7

python torch

torch版本:2.3.0+cpu
python: 3.9.11
错误消息:RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.
求解惑,谢谢

import torch
import torch.nn as nn
mdl = nn.Linear(1,1)
x = torch.linspace(0,1,5,requires_grad=True).view(-1,1)
y1 = torch.tanh(mdl(x))
y2 = mdl(x)
dy1 = torch.autograd.grad(y1,x,torch.ones_like(y1),create_graph=True,retain_graph=True)[0]
ddy1 = torch.autograd.grad(dy1,x,grad_outputs=torch.ones_like(dy1),create_graph=True,retain_graph=True)[0]
dy2 = torch.autograd.grad(y2,x,torch.ones_like(y2),create_graph=True,retain_graph=True)[0]

# 以上都正确,但下面这行为什么会报错?
ddy2 = torch.autograd.grad(dy2,x,grad_outputs=torch.ones_like(dy2),create_graph=True,retain_graph=True)[0]
  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-04-29 22:27
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    遇到这个错误通常是因为在进行梯度计算时,某些参与了计算的Tensor在最终的输出中没有被使用到。在您提供的代码中,y2和随后的dy2计算直接绕过了torch.tanh激活函数,这意味着从xy2的路径在第二次梯度计算(即计算ddy2)时,可能有部分梯度路径没有被实际的输出所触及,导致PyTorch认为这些Tensor是未使用的。

    要解决这个问题,确保在计算二阶导数时,所有中间变量的梯度路径都被正确地考虑,或者正如错误信息提示的那样,可以设置allow_unused=True来允许未使用的Tensor。这告诉PyTorch即使某些Tensor在计算过程中没有被用到,也继续执行梯度计算。

    下面是修改后的代码,其中对ddy2的计算添加了allow_unused=True参数:

    import torch
    import torch.nn as nn
    
    # 创建模型和数据
    mdl = nn.Linear(1,1)
    x = torch.linspace(0,1,5,requires_grad=True).view(-1,1)
    
    # 前向传播
    y1 = torch.tanh(mdl(x))
    y2 = mdl(x)
    
    # 计算一阶导数
    dy1 = torch.autograd.grad(y1, x, torch.ones_like(y1), create_graph=True, retain_graph=True)[0]
    ddy1 = torch.autograd.grad(dy1, x, grad_outputs=torch.ones_like(dy1), create_graph=True, retain_graph=True)[0]
    
    dy2 = torch.autograd.grad(y2, x, torch.ones_like(y2), create_graph=True, retain_graph=True)[0]
    
    # 修改这里,添加allow_unused=True来避免错误
    ddy2 = torch.autograd.grad(dy2, x, grad_outputs=torch.ones_like(dy2), create_graph=True, retain_graph=True, allow_unused=True)[0]
    
    # 如果ddY2实际上未被用到,它将返回None,可以通过检查来确认
    if ddy2 is None:
        print("ddy2 的计算中包含了未使用的变量,但已成功执行。")
    else:
        print("ddy2 成功计算。")
    

    这段代码应该能避免那个特定的错误,并且让你能够继续进行梯度的计算。如果在特定的上下文中,你确定那些变量应当被使用,但仍然遇到此问题,可能需要重新审视模型结构或梯度计算逻辑。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月29日

悬赏问题

  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题