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)