AttributeError: у объекта 'NoneType' нет атрибута 'zero_' - PullRequest
1 голос
/ 11 февраля 2020

Субобъект Grad становится «Нет», если развернуть выражение. Не уверен почему? Может кто-нибудь дать некоторую подсказку. Если развернуть ошибку выброса w.grand.zero_ () как " AttributeError: у объекта 'NoneType' нет атрибута 'ноль _' "

Спасибо, Гейн sh

import torch

x = torch.randint(size = (1,2), high = 10)
w = torch.Tensor([16,-14])
b = 36

y = w * x + b

epoch = 20
learning_rate = 0.01

w1 = torch.rand(size= (1,2), requires_grad= True)
b1 = torch.ones(size = [1], requires_grad= True)

for i in range(epoch):
    y1 = w1 * x + b1

    loss = torch.sum((y1-y)**2)

    loss.backward()

    with torch.no_grad():
        #w1 = w1 - learning_rate * w1.grad  //Not Working : w1.grad becomes "None" not sure how ;(
        #b1 = b1 - learning_rate * b1.grad  

        w1 -= (learning_rate * w1.grad)  // Working code.
        b1 -= (learning_rate * b1.grad)

        w1.grad.zero_()
        b1.grad.zero_()

    print("B ", b1)  
    print("W ", w1)

1 Ответ

0 голосов
/ 11 февраля 2020

Дело в том, что в вашем рабочем коде вы изменяете существующую переменную с атрибутом grad, а в случае non-working вы создаете новую переменную.

Как новая w1 / * Переменная 1006 * создана, у нее нет атрибута градиента, поскольку вы не вызывали backward() для нее, но для «исходной» переменной.

Сначала давайте проверим, так ли это на самом деле:

print(id(w1)) # Some id returned here
w1 = w1 - learning_rate * w1.grad

# In case below w1 address doesn't change
# w1 -= learning_rate * w1.grad 

print(id(w1)) # Another id here

Теперь вы можете скопировать его на месте и не затормозить, но нет смысла это делать, и ваш рабочий случай намного понятнее, но для потомков:

w1.copy_(w1 - learning_rate * w1.grad)
...