使用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 (将#修改为@)