Optimization 如何在PyTorch的正向过程中使用优化器

Optimization 如何在PyTorch的正向过程中使用优化器,optimization,pytorch,torch,autograd,Optimization,Pytorch,Torch,Autograd,我想在自定义函数的正向传递中使用优化器,但它不起作用。我的代码如下: class MyFct(Function): @staticmethod def forward(ctx, *args): input, weight, bias = args[0], args[1], args[2] y = torch.tensor([[0]], dtype=torch.float, requires_grad=True) #initial guess

我想在自定义函数的正向传递中使用优化器,但它不起作用。我的代码如下:

class MyFct(Function):

   @staticmethod
   def forward(ctx, *args):
       input, weight, bias = args[0], args[1], args[2]

       y = torch.tensor([[0]], dtype=torch.float, requires_grad=True) #initial guess
       loss_fn = lambda y_star: (input + weight - y_star)**2

       learning_rate = 1e-4
       optimizer = torch.optim.Adam([y], lr=learning_rate)
       for t in range(5000):
           y_star = y
           print(y_star)
           loss = loss_fn(y_star)
           if t % 100 == 99:
               print(t, loss.item())
           optimizer.zero_grad()
           loss.backward()
           optimizer.step() 

       return y_star
这就是我的测试输入:

x = torch.tensor([[2]], dtype=torch.float, requires_grad=True)
w = torch.tensor([[2]], dtype=torch.float, requires_grad=True)
y = torch.tensor([[6]], dtype=torch.float)

fct= MyFct.apply
y_hat = fct(x, w, None)
我总是得到运行时错误:张量的元素0不需要梯度,也没有梯度fn

另外,我已经测试了forward之外的优化,它是有效的,所以我猜这是与上下文有关的?根据文档“跟踪历史记录的张量参数(即,requires_grad=True)将转换为调用前不跟踪历史记录的张量参数,并且它们的使用将记录在图表中”,请参阅。这就是问题所在吗?有办法解决这个问题吗


我是PyTorch的新手,我想知道我忽略了什么。任何帮助和解释都将不胜感激

我想我在这里找到了一个答案:,也就是说,我需要用torch.enable_grad():来包装oprimization

但是,我仍然不明白为什么有必要将原始张量转换为不跟踪forward()中历史的张量