Attribute Error: `loss.backward()` returns None
Attribute Error: `loss.backward()` returns None
我正在尝试实现 Learner
对象及其步骤,并在 loss.backward()
函数引发和 AttributeError: 'NoneType' object has no attribute 'data'
时遇到问题
当我按照 第 04 章 MNIST 基础知识 进行操作时,整个过程都有效。但是,在 class 中实施会引发此错误。谁能指导我为什么会出现这种情况以及如何解决这个问题?
下面是代码:
class Basic_Optim:
def __init__(self, params, lr):
self.params = list(params)
self.lr = lr
def step(self):
for p in self.params:
p.data -= self.lr * p.grad.data
def zero(self):
for p in self.params:
p.grad = None
class Learner_self:
def __init__(self, train, valid, model, loss, metric, params, lr):
self.x = train
self.y = valid
self.model = model
self.loss = loss
self.metric = metric
self.opt_func = Basic_Optim(params, lr)
def fit(self, epochs):
for epoch in range(epochs):
self.train_data()
score = self.valid_data()
print(score, end = ' | ')
def train_data(self):
for x, y in self.x:
preds = self.model(x)
loss = self.loss(preds, y)
loss_b = loss.backward()
print(f'Loss: {loss:.4f}, Loss Backward: {loss_b}')
self.opt_func.step()
self.opt_func.zero()
def valid_data(self):
accuracy = [self.metric(xb, yb) for xb, yb in self.y]
return round(torch.stack(accuracy).mean().item(), 4)
learn = Learner_self(dl, valid_dl, simple_net, mnist_loss, metric=batch_accuracy,
params=linear_model.parameters(), lr = 1)
learn.fit(10)
OUTPUT 来自 train_data
中的打印语句打印:Loss: 0.0516, Loss Backward: None
然后引发上面共享的属性错误。
如果您需要更多详细信息,请告诉我。每个其他功能,例如 mnist_loss
、batch_accuracy
、simple_net
与book完全相同。
提前谢谢你。
您的优化器和训练器似乎不适用于同一模型。
您有 model=simple_net
,而优化器的参数是 不同 模型的参数 params=linear_model.parameters()
。
尝试通过 params=simple_net.parameters()
-- 也就是说,确保培训师的 params
是 model
.
我正在尝试实现 Learner
对象及其步骤,并在 loss.backward()
函数引发和 AttributeError: 'NoneType' object has no attribute 'data'
当我按照 第 04 章 MNIST 基础知识 进行操作时,整个过程都有效。但是,在 class 中实施会引发此错误。谁能指导我为什么会出现这种情况以及如何解决这个问题?
下面是代码:
class Basic_Optim:
def __init__(self, params, lr):
self.params = list(params)
self.lr = lr
def step(self):
for p in self.params:
p.data -= self.lr * p.grad.data
def zero(self):
for p in self.params:
p.grad = None
class Learner_self:
def __init__(self, train, valid, model, loss, metric, params, lr):
self.x = train
self.y = valid
self.model = model
self.loss = loss
self.metric = metric
self.opt_func = Basic_Optim(params, lr)
def fit(self, epochs):
for epoch in range(epochs):
self.train_data()
score = self.valid_data()
print(score, end = ' | ')
def train_data(self):
for x, y in self.x:
preds = self.model(x)
loss = self.loss(preds, y)
loss_b = loss.backward()
print(f'Loss: {loss:.4f}, Loss Backward: {loss_b}')
self.opt_func.step()
self.opt_func.zero()
def valid_data(self):
accuracy = [self.metric(xb, yb) for xb, yb in self.y]
return round(torch.stack(accuracy).mean().item(), 4)
learn = Learner_self(dl, valid_dl, simple_net, mnist_loss, metric=batch_accuracy,
params=linear_model.parameters(), lr = 1)
learn.fit(10)
OUTPUT 来自 train_data
中的打印语句打印:Loss: 0.0516, Loss Backward: None
然后引发上面共享的属性错误。
如果您需要更多详细信息,请告诉我。每个其他功能,例如 mnist_loss
、batch_accuracy
、simple_net
与book完全相同。
提前谢谢你。
您的优化器和训练器似乎不适用于同一模型。
您有 model=simple_net
,而优化器的参数是 不同 模型的参数 params=linear_model.parameters()
。
尝试通过 params=simple_net.parameters()
-- 也就是说,确保培训师的 params
是 model
.