pytorch backprop通过volatile变量错误

时间:2017-10-01 14:17:25

标签: python python-2.7 tensorflow pytorch

我试图通过几次向后传递迭代运行并在每一步更新输入来最小化某些目标相对于某个目标的输入。第一遍成功运行但第二遍传出以下错误: RuntimeError: element 0 of variables tuple is volatile

此代码段演示了问题

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重新分配之前,但在重新分配后,会切换到True和{分别为{1}}。为什么成为volatile变量会阻止第二个backprop运行?

1 个答案:

答案 0 :(得分:4)

您必须在每次更新之前将渐变清零,如下所示:

Select date,date::date -interval '1 month'
from table

但是在您的代码中,每次更新渐变时都会创建另一个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_()