Download src/callbacks.py from Michal-Raszkowski/style-transfer-adain: direct link, hf CLI and curl.
- Browser
- Download file 1.56 kB
-
https://huggingface.co/spaces/Michal-Raszkowski/style-transfer-adain/resolve/refs%2Fpr%2F1/src/callbacks.py
- Command line
-
hf download hf://spaces/Michal-Raszkowski/style-transfer-adain@refs/pr/1/src/callbacks.py
-
curl -L -o callbacks.py https://huggingface.co/spaces/Michal-Raszkowski/style-transfer-adain/resolve/refs%2Fpr%2F1/src/callbacks.py
1.56 kB
| 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") | |
| ] | |
| }) |