繁体   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