Groups together several callbacks and delegates training loop notifications to the encapsulated objects.
| 47 | |
| 48 | |
| 49 | class CallbacksGroup(Callback): |
| 50 | """ |
| 51 | Groups together several callbacks and delegates training loop |
| 52 | notifications to the encapsulated objects. |
| 53 | """ |
| 54 | def __init__(self, callbacks): |
| 55 | self.callbacks = callbacks |
| 56 | self.named_callbacks = {to_snake_case(classname(cb)): cb for cb in self.callbacks} |
| 57 | |
| 58 | def __getitem__(self, item): |
| 59 | item = to_snake_case(item) |
| 60 | if item in self.named_callbacks: |
| 61 | return self.named_callbacks[item] |
| 62 | raise KeyError(f'callback name is not found: {item}') |
| 63 | |
| 64 | def training_started(self, **kwargs): self.invoke('training_started', **kwargs) |
| 65 | |
| 66 | def training_ended(self, **kwargs): self.invoke('training_ended', **kwargs) |
| 67 | |
| 68 | def epoch_started(self, **kwargs): self.invoke('epoch_started', **kwargs) |
| 69 | |
| 70 | def phase_started(self, **kwargs): self.invoke('phase_started', **kwargs) |
| 71 | |
| 72 | def phase_ended(self, **kwargs): self.invoke('phase_ended', **kwargs) |
| 73 | |
| 74 | def epoch_ended(self, **kwargs): self.invoke('epoch_ended', **kwargs) |
| 75 | |
| 76 | def batch_started(self, **kwargs): self.invoke('batch_started', **kwargs) |
| 77 | |
| 78 | def batch_ended(self, **kwargs): self.invoke('batch_ended', **kwargs) |
| 79 | |
| 80 | def before_forward_pass(self, **kwargs): self.invoke('before_forward_pass', **kwargs) |
| 81 | |
| 82 | def after_forward_pass(self, **kwargs): self.invoke('after_forward_pass', **kwargs) |
| 83 | |
| 84 | def before_backward_pass(self, **kwargs): self.invoke('before_backward_pass', **kwargs) |
| 85 | |
| 86 | def after_backward_pass(self, **kwargs): self.invoke('after_backward_pass', **kwargs) |
| 87 | |
| 88 | def invoke(self, method, **kwargs): |
| 89 | with torch.set_grad_enabled(False): |
| 90 | for cb in self.callbacks: |
| 91 | getattr(cb, method)(**kwargs) |