自定义PyTorch优化器工作不正常,我无法访问渐变

自定义PyTorch优化器工作不正常,我无法访问渐变,pytorch,Pytorch,我试图实现论文中的弹性平均随机梯度下降(EASGD)算法,但遇到了一些麻烦 我正在使用PyTorch的类并引用和,以便从某个地方开始 我拥有的代码是: import torch.optim as optim class EASGD(optim.Optimizer): def __init__(self, params, lr, tau, alpha=0.001): self.alpha = alpha if lr < 0.0:

我试图实现论文中的弹性平均随机梯度下降(EASGD)算法,但遇到了一些麻烦

我正在使用PyTorch的类并引用和,以便从某个地方开始

我拥有的代码是:

import torch.optim as optim


class EASGD(optim.Optimizer):
    def __init__(self, params, lr, tau, alpha=0.001):
        self.alpha = alpha

        if lr < 0.0:
            raise ValueError(f"Invalid learning rate {lr}.")

        defaults = dict(lr=lr, alpha=alpha, tau=tau)
        super(EASGD, self).__init__(params, defaults)

    def __setstate__(self, state):
        super(EASGD, self).__setstate__(state)

    def step(self, closure=None):
        loss = None
        if closure is not None:
            with torch.enable_grad():
                loss = closure()

        for group in self.param_groups:
            tau = group['tau']

            for t, p in enumerate(group['params']):
                x_normal = p.clone()
                x_tilde = p.clone()

                if p.grad is None:
                    continue

                if t % tau == 0:
                    p = p - self.alpha * (x_normal - x_tilde)
                    x_tilde = x_tilde + self.alpha * (x_normal - x_tilde)

                d_p = p.grad.data
                p.data.add_(d_p, alpha=-group['lr'])

        return loss
将torch.optim导入为optim
类EASGD(optim.Optimizer):
定义初始值(自、参数、lr、τ、α=0.001):
self.alpha=alpha
如果lr<0.0:
raise VALUERROR(f“无效学习率{lr}.”)
默认值=dict(lr=lr,alpha=alpha,tau=tau)
super(EASGD,self)。\uuuu init\uuuu(参数,默认值)
定义设置状态(自身、状态):
超级(EASGD,自我)。\uuu设置状态\uuuu(状态)
def步骤(自关闭=无):
损失=无
如果关闭不是无:
使用火炬。启用_梯度():
损失=关闭()
对于self.param_组中的组:
tau=组['tau']
对于枚举中的t,p(组['params']):
x_normal=p.clone()
x_tilde=p.clone()
如果p.grad为无:
持续
如果t%tau==0:
p=p-self.alpha*(x_normal-x_tilde)
x_tilde=x_tilde+self.alpha*(x_normal-x_tilde)
d_p=p.梯度数据
p、 data.add(d_p,alpha=-group['lr'])
回波损耗
运行此代码时,出现以下错误:

/home/user/github/test repo/easgd.py:50:UserWarning:正在访问不是叶张量的张量的
.grad
属性。在
autograd.backward()
期间,不会填充其.grad属性。如果确实需要非叶张量的梯度,请在非叶张量上使用
。retain_grad()
。如果您错误地访问了非叶张量,请确保您访问的是叶张量。有关更多信息,请参见github.com/pytorch/pytorch/pull/30531

阅读有助于理解叶变量和非叶变量之间的区别,但我不确定如何修复代码以使其正常工作


任何关于做什么或去哪里看的建议都将不胜感激。谢谢。

我想问题是您在这一行复制了
p

p = p - self.alpha * (x_normal - x_tilde)
如果此行被执行(在第一个循环中,当
t=0
)时,由于
p
不再具有
.grad
属性,因此下一行将引发错误

您应该改用内插运算符、
add\u
mult\u
sub\u
divide\u

for t, p in enumerate(group['params']):
    if p.grad is None:
        continue
    d_p = p.grad.data

    if t % tau == 0:
        d_p.sub_(self.alpha*0.01)

    p.data.add_(d_p, alpha=-group['lr'])

上面,我已经删除了
x_normal
x_tilde
,因为您没有给它们正确的值。但我希望你能明白。在处理
步骤
函数中的数据时,仅使用在位运算符。

您确定
中的
p
对于枚举中的t,p(组['params'):
是叶张量吗?