epoch 0: 0% 0/1 [00:00<?, ?it/s, loss=0, step=0] --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-186-45f9fc362d47> in <cell line: 5>() 3 optimizer = NAGD(net.parameters(), 0.02) 4 ----> 5 losses, states = the_loop(net, optimizer, data_loader, epochs=epochs) 6 7 fig = plot_losses(losses) 2 frames <ipython-input-185-98ade4f02620> in step(self) 17 for i, p in enumerate(self.param_groups[0]['params']): 18 if p.grad is not None: ---> 19 self.v[p] = self.momentum * self.v[p] + self.lr * (-p.grad) 20 # compute Nesterov update 21 p_nesterov = p.data - self.momentum * self.v[p] AttributeError: 'NAGD' object has no attribute 'v'这个错误怎么修改?
时间: 2023-08-25 11:38:33 浏览: 183
这个错误提示是说在 `NAGD` 类中没有 `v` 属性,因此在 `self.v[p]` 上发生了 AttributeError。这是因为我们在 `__init__` 方法中初始化了 `v`,但没有将其作为 `NAGD` 类的属性来保存。我们可以将 `v` 设置为 `self.v`,并在 `__init__` 方法中使用 `self.v` 来保存 `v`。修改后的代码如下:
```
class NAGD(Optimizer):
def __init__(self, params, lr=0.2, momentum=0.9) -> None:
super().__init__(params, {'lr': lr, 'momentum': momentum})
self.lr = lr
self.momentum = momentum
self.v = {} # initialize velocity as an empty dictionary
for param in self.param_groups[0]['params']:
self.v[param] = torch.zeros_like(param.data) # initialize velocity for each parameter as a tensor of zeros
def step(self):
with torch.no_grad():
for i, p in enumerate(self.param_groups[0]['params']):
if p.grad is not None:
# update velocity
self.v[p] = self.momentum * self.v[p] + self.lr * (-p.grad)
# compute Nesterov update
p_nesterov = p.data - self.momentum * self.v[p]
# update parameters
p.data.copy_(p_nesterov)
```
我们在 `__init__` 方法中添加了 `self.v = {}` 来将 `v` 设置为 `NAGD` 类的属性,然后在 `for` 循环中使用 `self.v[p]` 来更新 `v`。这样就可以避免 AttributeError 了。
阅读全文