Pytorch - RuntimeError: intentando retroceder por el gráfico por segunda vez, pero los buffers ya se han liberado

Sigo encontrándome con este error:

RuntimeError: Intentando retroceder por el gráfico por segunda vez, pero los búferes ya se han liberado. Especifiquetain_graph = True cuando llame hacia atrás la primera vez.

Busqué en el foro de Pytorch, pero aún no puedo descubrir qué he hecho mal en mi función de pérdida personalizada. Mi modelo es nn.GRU, y aquí está mi función de pérdida personalizada:

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))

Código de entrenamiento:

    # 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)

Respuestas a la pregunta(1)

Su respuesta a la pregunta