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_lossbatch_accuracysimple_netbook完全相同。 提前谢谢你。

您的优化器和训练器似乎不适用于同一模型。
您有 model=simple_net,而优化器的参数是 不同 模型的参数 params=linear_model.parameters()

尝试通过 params=simple_net.parameters() -- 也就是说,确保培训师的 paramsmodel.