How to apply backward by summing multiple losses?
Hi.
I am training a model using multiple data loaders.
First, the example code is as follows:
loss_list = list()
for epoch in range(cfg.start_epoch, cfg.max_epoch):
batch_time = AverageMeter()
data_time = AverageMeter()
losses = AverageMeter()
losses_exist = AverageMeter()
print("Train Epoch: {}".format(epoch))
model.train()
end = time.time()
for i in range(len(train_loader_list)):
train_loader = train_loader_list[i]
for batch_idx, sample in enumerate(train_loader):
data_time.update(time.time() - end)
optimizer.zero_grad()
input = sample['image'].cuda()
target = sample['label'].cuda()
target_exist = sample['exist'].cuda()
output, output_exist = model(input) # output_mid
loss_seg = criterion(torch.nn.functional.log_softmax(output, dim=1), target)
loss_exist = criterion_exist(output_exist, target_exist)
loss = loss_seg + loss_exist * 0.1
losses.update(loss.data.item(), input.size(0))
losses_exist.update(loss_exist.item(), input.size(0))
# optimizer.zero_grad()
loss.backward()
optimizer.step()
# scheduler.step()
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
if (batch_idx + 1) % cfg.print_freq == 0:
print((
'dataloader: {0} input_shape: {1} Epoch: [{2}][{3}/{4}], lr: {lr:.5f}\t' 'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t' 'Data {data_time.val:.3f} ({data_time.avg:.3f})\t' 'Loss {loss.val:.4f} ({loss.avg:.4f})\t' 'Loss_exist {loss_exist.val:.4f} ({loss_exist.avg:.4f})\t'.format(
i, input.shape[2:], epoch, batch_idx, len(train_loader), batch_time=batch_time,
data_time=data_time,
loss=losses,
loss_exist=losses_exist, lr=optimizer.param_groups[-1]['lr'])))
batch_time.reset()
data_time.reset()
losses.reset()
if batch_idx == len(train_loader) - 1:
loss_list.append(loss)
for loss_sample in loss_list:
loss += loss_sample
loss_tot = loss / len(loss_list)
loss_tot.backward()
optimizer.step()
As a result, several losses are inserted into the loss_list and finally the average of the losses is calculated.
Then, I want to backward the average loss to the model.
However, the following error occurs during the backward process.
RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling backward the first time.
Is there a way to backward the average loss again?
Thank you.