gpt4 book ai didi

python - pytorch backprop through volatile variable 错误

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:05 28 4
gpt4 key购买 nike

我正在尝试通过多次向后传递迭代运行它并在每一步更新输入来最小化与某个目标相关的一些输入。第一遍运行成功,但第二遍出现以下错误:
RuntimeError:变量元组的元素 0 是易变的

此代码片段演示了问题

import torch
from torch.autograd import Variable
import torch.nn as nn

inp = Variable(torch.Tensor([1]), requires_grad=True)
target = Variable(torch.Tensor([3]))

loss_fn = nn.MSELoss()

for i in range(2):
loss = loss_fn(inp, target)
loss.backward()
gradient = inp.grad
inp = inp - inp.grad * 0.01

当我检查 inp 的值时,在最后一行重新分配之前,inp.volatile => Falseinp.requires_grad => True 但在重新分配后,它们分别切换到 TrueFalse。为什么作为 volatile 变量会阻止第二次反向传播运行?

最佳答案

你必须在每次更新之前将梯度归零:

inp.grad.data.zero_()

但在您的代码中,每次更新渐变时,您都会创建另一个 Variable 对象,因此您必须像这样更新整个历史记录:

import torch
from torch.autograd import Variable
import torch.nn as nn

inp_hist = []
inp = Variable(torch.Tensor([1]), requires_grad=True)
target = Variable(torch.Tensor([3]))

loss_fn = nn.MSELoss()

for i in range(2):
loss = loss_fn(inp, target)
loss.backward()
gradient = inp.grad
inp_hist.append(inp)
inp = inp - inp.grad * 0.01
for inp in inp_hist:
inp.grad.data.zero_()

但是通过这种方式,您将计算您在历史记录中创建的所有先前输入的梯度(这很糟糕,这是一种浪费),正确的实现如下所示:

import torch
from torch.autograd import Variable
import torch.nn as nn
inp = Variable(torch.Tensor([1]), requires_grad=True)
target = Variable(torch.Tensor([3]))
loss_fn = nn.MSELoss()
for i in range(2):
loss = loss_fn(inp, target)
loss.backward()
gradient = inp.grad
inp.data = inp.data - inp.grad.data * 0.01
inp.grad.data.zero_()

关于python - pytorch backprop through volatile variable 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46513276/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com