我正在嘗試實作該Learner物件及其步驟,并在該loss.backward()函式提出和AttributeError: 'NoneType' object has no attribute 'data'
當我遵循第 04 章 MNIST 基礎知識時,整個程序都有效。但是,在類中實作會引發此錯誤。任何人都可以指導我為什么會發生這種情況以及解決這個問題的方法嗎?
下面是代碼:
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)
OUTPUTtrain_data來自prints:內的 print 陳述句Loss: 0.0516, Loss Backward: None,然后引發上面共享的 Attribute 錯誤。
如果您想了解更多詳細資訊,請告訴我。其他所有功能,如mnist_loss,batch_accuracy,與本書simple_net中的完全相同。先感謝您。
uj5u.com熱心網友回復:
您的優化器和您的培訓師似乎不在同一個模型上作業。
你有model=simple_net,而優化器的引數是不同模型的引數params=linear_model.parameters()。
嘗試通過params=simple_net.parameters()- 也就是說,確保培訓師params是model.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427793.html
上一篇:postgres/psycopg:匯入CSV的日期格式錯誤
下一篇:洗掉例外值后具有新例外值的資料集
