目录
  • backward报错2次访问计算图需要 retain_graph=True 的一种情况
    • 错误代码
    • 正确代码
  • 总结

    backward报错2次访问计算图需要 retain_graph=True 的一种情况

    错误代码

    错误的原因在于

    y1 = 0.5*x*2-1.2*x
    y2 = x**3
    

    没有放到循环里面,没有随着 x 的优化而相应变化。

    import torch
    import numpy as np
    import torch.optim as optim
    
    torch.autograd.set_detect_anomaly(True)
    
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    x = torch.tensor([1.0, 2.0, 3.0,4.5], dtype=torch.float32, requires_grad=True, device=device)
    
    
    y_GT= torch.tensor([10, -20, -30,45], dtype=torch.float32,  device=device)
    
    print(f'x{x}')
    
    
    optimizer = optim.Adam([x], lr=1)
    y1 = 0.5*x*2-1.2*x
    y2 = x**3
    
    for i in range(10):
    
        print(f'{i}: x{x}')
        optimizer.zero_grad()
    
    
        loss = (y1+y2-y_GT).mean()
        loss.backward()
        optimizer.step()
        print(f'{i}: x{x}')
    
    

    正确代码

    import torch
    import numpy as np
    import torch.optim as optim
    
    torch.autograd.set_detect_anomaly(True)
    
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    x = torch.tensor([1.0, 2.0, 3.0,4.5], dtype=torch.float32, requires_grad=True, device=device)
    
    
    y_GT= torch.tensor([10, -20, -30,45], dtype=torch.float32,  device=device)
    
    print(f'x{x}')
    
    
    optimizer = optim.Adam([x], lr=1)
    
    
    for i in range(10):
    
        print(f'{i}: x{x}')
        optimizer.zero_grad()
        y1 = 0.5*x*2-1.2*x
        y2 = x**3
    
        loss = (y1+y2-y_GT).mean()
        loss.backward()
        optimizer.step()
        print(f'{i}: x{x}')
    
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。