关于#pytorch#的问题:用backward函数求导,结果一直为None下面是程序图,确保程序中的tensor都将requires_grad_()参数设置为TRUE结果图(语言-python)

用backward函数求导,结果一直为None
下面是程序图,确保程序中的tensor都将requires_grad_()参数设置为TRUE

img


结果图

img

  • 看下这篇博客,也许你就懂了,链接:Pytorch-创建requires_grad=True的tensor
  • 除此之外, 这篇博客: 【pytorch】从入门到构建一个分类网络超长超详细教程(附代码)中的 创建一个张量,设置 requires_grad=True 来跟踪与它相关的计算 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • x = torch.ones(2, 2, requires_grad=True)
    print(x)
    # 针对张量做一个操作
    y = x + 2
    print(y)
    # y 作为操作的结果被创建,所以它有 grad_fn
    print(y.grad_fn)
    # 针对张量做更多操作
    z = y * y * 3
    out = z.mean()
    print(z, out)
    
    console:
    tensor([[1., 1.],
            [1., 1.]], requires_grad=True)
    # 每个张量都有一个 .grad_fn 属性保存着创建了张量的 Function 的引用
    tensor([[3., 3.],
            [3., 3.]], grad_fn=<AddBackward0>) <AddBackward0 object at 0x000001989F20D7B8>
    tensor([[27., 27.],
            [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
    

在使用PyTorch进行自动求导时,确保以下几点可以帮助您获得有效的梯度计算:

  1. 使用浮点数数据类型:确保您的张量是浮点数类型(如torch.FloatTensor),因为只有浮点数类型的张量才支持自动求导。
  2. 设置requires_grad_()为True:对于需要计算梯度的张量,使用requires_grad_()方法将其requires_grad属性设置为True。这会启用对该张量的梯度跟踪。
  3. 执行前向传播和反向传播:在计算图中进行前向传播操作,然后使用backward()方法执行反向传播。这将计算梯度并存储在相应的张量的grad属性中。
  4. 检查梯度:在完成反向传播后,您可以访问张量的grad属性来获取计算得到的梯度值。
    下面是一个简单的示例,展示如何使用PyTorch进行自动求导:
import torch

# 创建张量并设置requires_grad为True
x = torch.tensor(2.0, requires_grad=True)

# 定义一个计算图
y = x ** 2 + 3 * x + 1

# 执行反向传播
y.backward()

# 获取梯度值
print(x.grad)  # 输出:tensor(7.)

确保在您的程序中按照上述步骤使用了这些要点。如果您仍然遇到问题并且backward()方法返回None,请检查您的计算图是否正确,并确保所有涉及梯度计算的张量都具有正确的属性设置。