簡體   English   中英

如果我使用簡單的減號而不是 -=,pytorch 將 grad 屬性設置為無

[英]pytorch sets grad attribute to none if I use simple minus instead of -=

這是一個顯示問題的簡單代碼

import torch
X = torch.arange(-3, 3, step=0.1)
Y = X * 3
Y += 0.1 * torch.randn(Y.shape)

def my_train_model(iter):
    w = torch.tensor(-15.0, requires_grad=True)
    lr = 0.1
    for epoch in range(iter):
        print(w.grad)
        yhat = w * X
        loss = torch.mean((yhat - Y) ** 2)
        loss.backward()

        with torch.no_grad():
            print(w.grad)
            w = w - lr * w.grad # gradient exists if w-= lr*w.grad
            print(w.grad)
            w.grad.zero_()
        print(loss)

my_train_model(4)

這在執行w = w - lr * w.grad w.grad 設置為none ,但是如果我使用w -= lr * w.grad而不是上面的表達式,問題將得到解決!

第一個將w.grad設置為none的表達式有什么問題?

function torch.no_grad()保證不計算梯度,這意味着包含在其中的任何組件都是使用requires_grad=False創建的,如您在此示例中所見。

就地操作僅更改張量的值, 來自論壇的這個答案

就地操作是直接更改給定張量的內容而不進行復制的操作。

因此,對於您提出的問題, w = w - lr * w.gradw替換為沒有梯度的自身副本,而w -= lr * w.grad僅更改仍保持梯度的張量的內容來自torch.no_grad()之外的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM