Pytorch -运行时错误:尝试第二次向后浏览图表,但缓冲区已被释放

iszxjhcz  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(145)

我不断遇到这个错误:
运行时错误:尝试第二次向后调用图形,但缓冲区已被释放。第一次向后调用时,请指定retain_graph = True。
我在Pytorch论坛上搜索过了,但是仍然找不到我的自定义损失函数做错了什么。我的模型是nn. GRU,下面是我的自定义损失函数:

def _loss(outputs, session, items):  # `items` is a dict() contains embedding of all items
    def f(output, target):
        pos = torch.from_numpy(np.array([items[target["click"]]])).float()
        neg = torch.from_numpy(np.array([items[idx] for idx in target["suggest_list"] if idx != target["click"]])).float()
        if USE_CUDA:
            pos, neg = pos.cuda(), neg.cuda()
        pos, neg = Variable(pos), Variable(neg)

        pos = F.cosine_similarity(output, pos)
        if neg.size()[0] == 0:
            return torch.mean(F.logsigmoid(pos))
        neg = F.cosine_similarity(output.expand_as(neg), neg)

        return torch.mean(F.logsigmoid(pos - neg))

    loss = map(f, outputs, session)
return -torch.mean(torch.cat(loss))

培训代码:

# zero the parameter gradients
    model.zero_grad()

    # forward + backward + optimize
    outputs, hidden = model(inputs, hidden)
    loss = _loss(outputs, session, items)
    acc_loss += loss.data[0]

    loss.backward()
    # Add parameters' gradients to their values, multiplied by learning rate
    for p in model.parameters():
        p.data.add_(-learning_rate, p.grad.data)
pqwbnv8z

pqwbnv8z1#

问题来自我的训练循环:如果是这样,那么loss.backward()正在尝试反向传播,一直到时间的开始,这对第一个批次有效,但对第二个批次无效,因为第一个批次的图已经被丢弃。
有两种可能的解决方案。
1)在批处理之间分离/重新打包隐藏状态。(至少)有三种方法可以做到这一点(我选择了这个解决方案):

hidden.detach_()
 hidden = hidden.detach()

2)用loss.backward(retain_graph=True)替换loss.backward(),但是知道每个连续的批处理将比前一批处理花费更多的时间,因为它将必须一直向后传播到第一批处理的开始。
示例

6bc51xsx

6bc51xsx2#

我也有这个错误。我有时在我的模型中间输入相同的Tensor。通过对那个Tensor调用'.detach()',它消除了这个错误。
这个Tensor不是我训练的内容,我也不想让grad使用它,调用detach会把它从图中去掉,这样pytorch就不会考虑它了。

相关问题