微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Autograd .backward函数在Pytorch模型的正向传递中计算中间值

如何解决使用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 举报,一经查实,本站将立刻删除。