Hi!
I’m working on a project on molecule energies. The loss function consists of two parts: the energy term and the force term and forces are derivatives wrt the input coordinates. This is part of my code:
def energies_forces_trainer(container, optimizer, loss_fn):
def train_and_store_loss(engine, batch):
model.train()
optimizer.zero_grad()
inputs, targets = batch
final = {'energies': [], 'forces': []}
for s, c in inputs:
results = model((s, c)) # c stands for coordinates
_, energies = energy_shifter(results) # Some transformation
forces = -torch.autograd.grad(energies.sum(), c)[0] # I want to compute the result's derivatives wrt the input
final['energies'].append(results[1])
final['forces'].append(forces)
final['energies'] = torch.cat(final['energies'])
final['forces'] = torch.cat(final['forces'])
loss = loss_fn('energies')(targets, final) + loss_fn('forces')(targets, final) # Energy loss and force loss
loss.backward() # Error ocurrs
optimizer.step()
return loss.item()
return ignite.engine.Engine(train_and_store_loss)
This code produces ‘Trying to backward through the graph a second time’ error. So does torch.autograd.grad
accumulate grads? How can I include loss of derivatives?
Thank you!