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()中历史的张量