| import torch |
| import wandb |
| from lightning.pytorch.callbacks import Callback |
| from lightning.pytorch.loggers import WandbLogger |
| from torchvision.utils import make_grid |
|
|
| class ImageLogger(Callback): |
| def __init__(self, num_samples=4): |
| super().__init__() |
| self.num_samples = num_samples |
| self.fixed_batch = None |
|
|
| def on_validation_start(self, trainer, pl_module): |
| if self.fixed_batch is None: |
| device = pl_module.device |
| val_loader = trainer.datamodule.val_dataloader() |
| batch = next(iter(val_loader)) |
| c, s = batch |
| self.fixed_batch = (c[:self.num_samples].to(device), s[:self.num_samples].to(device)) |
|
|
| def on_validation_epoch_end(self, trainer, pl_module): |
| if self.fixed_batch is None: return |
| |
| c, s = self.fixed_batch |
| |
| with torch.no_grad(): |
| gen, _ = pl_module(c, s) |
|
|
| imgs = [] |
| for i in range(len(c)): |
| imgs.append(c[i].cpu()) |
| imgs.append(s[i].cpu()) |
| imgs.append(gen[i].cpu()) |
| |
| imgs_stack = torch.stack(imgs) |
| |
| imgs_stack = torch.clamp(imgs_stack, 0, 1) |
|
|
| from torchvision.utils import make_grid |
| grid = make_grid(imgs_stack, nrow=3, padding=2) |
|
|
| if isinstance(trainer.logger, WandbLogger): |
| trainer.logger.experiment.log({ |
| "val/comparison": [ |
| wandb.Image(grid, caption=f"Epoch: {trainer.current_epoch} Content | Style | Generated") |
| ] |
| }) |