如何解决使用Autograd .backward函数在Pytorch模型的正向传递中计算中间值
你好,我是Pytorch的新手。我有一个简单的pytorch模块,其中模块的输出是标量损失函数,它取决于某些多项式函数的导数。假设正向传递的输出为:input * derivative(x ^ 2 + y ^ 2)。
实现此目的的一种方法是显式地写下所使用的多项式的导数,并将其作为正向模型的一部分。因此输出=输入*(2x + 2y)。但是,这似乎不可靠,好像我要包含更多的多项式一样,我必须手动添加更多的导数函数,这些函数既耗时又容易出错。
我想初始化多项式,使用Autograd来获取它们的导数,然后将该导数插入输出公式。假设多项式函数称为n。我在前进通道内执行n.backward(retain_graph = True)。但是,它似乎无法正常工作,因为我得到的答案(损失函数的导数的幅度与模型参数的差值)与在前向传递中使用解析表达式时完全不同。
请注意,f.backward的输出和导数的解析表达式都匹配。因此,它可以正确计算多项式的导数,但是很难将其与最终损失函数相关联。这意味着当它试图获取多项式系数的导数时,backward()调用也弄乱了模型参数。我确信这是因为我对pytorch的了解不足,并且在正向传递中添加f.backward()调用会以某种方式弄乱了loss.backward()调用。
这是一个简化的示例:问题在于,使用解析方法和autograd .backward()方法时,值model.learn.grad不相同
class Model(nn.Module):
def __init__(self,grin_type='radial',loss_type='analytic',device='cpu',dtype=torch.float32):
super(Model,self).__init__()
self.dtype=dtype
self.device=device
self.loss_type=loss_type
self.grin_type=grin_type
self.x=torch.tensor(2.,dtype = dtype,device=self.device) #mm
self.learn=nn.Parameter(torch.tensor(5.,device=self.device))
def forward(self,inputs,plotting=0):
if self.loss_type=='analytic':
outputs=inputs*self.learn*(2.*self.x)
elif self.loss_type=='autograd':
self.der=self.calc_derivative(self.x)
outputs=inputs*self.der
return outputs
def poly_fun(self,x):
return self.learn*torch.square(x)
def calc_derivative(self,x):
xn=x.clone().detach().requires_grad_(True)
n=self.poly_fun(xn)
dloss_dx=torch.autograd.grad(outputs=n,inputs=xn,create_graph=True)[0]*n/n
return dloss_dx
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。