()
| 1474 | |
| 1475 | # wrap the forward step in a closure so second order methods work |
| 1476 | def optimizer_closure(): |
| 1477 | # forward pass |
| 1478 | output = self.training_forward( |
| 1479 | split_batch, batch_idx, opt_idx, self.hiddens) |
| 1480 | |
| 1481 | closure_loss = output[0] |
| 1482 | progress_bar_metrics = output[1] |
| 1483 | log_metrics = output[2] |
| 1484 | callback_metrics = output[3] |
| 1485 | self.hiddens = output[4] |
| 1486 | if closure_loss is None: |
| 1487 | return None |
| 1488 | |
| 1489 | # accumulate loss |
| 1490 | # (if accumulate_grad_batches = 1 no effect) |
| 1491 | closure_loss = closure_loss / self.accumulate_grad_batches |
| 1492 | |
| 1493 | # backward pass |
| 1494 | model_ref = self.get_model() |
| 1495 | if closure_loss.requires_grad: |
| 1496 | model_ref.backward(closure_loss, optimizer) |
| 1497 | |
| 1498 | # track metrics for callbacks |
| 1499 | all_callback_metrics.append(callback_metrics) |
| 1500 | |
| 1501 | # track progress bar metrics |
| 1502 | self.add_tqdm_metrics(progress_bar_metrics) |
| 1503 | all_log_metrics.append(log_metrics) |
| 1504 | |
| 1505 | # insert after step hook |
| 1506 | if self.is_function_implemented('on_after_backward'): |
| 1507 | model_ref = self.get_model() |
| 1508 | model_ref.on_after_backward() |
| 1509 | |
| 1510 | return closure_loss |
| 1511 | |
| 1512 | # calculate loss |
| 1513 | loss = optimizer_closure() |
nothing calls this directly
no test coverage detected