Source code for ablator.modules.loggers.tensor
from pathlib import Path
from typing import Union
import numpy as np
import pandas as pd
from omegaconf import OmegaConf
from tensorboardX import SummaryWriter
from ablator.config.main import ConfigBase
from ablator.config.utils import flatten_nested_dict
from ablator.modules.loggers import LoggerBase
[docs]class TensorboardLogger(LoggerBase):
"""
A logger class for Tensorboard visualization.
Attributes
----------
summary_dir : Union[str, Path]
The directory to store the Tensorboard summary files.
backend_logger : SummaryWriter
The PyTorch Tensorboard SummaryWriter object used to log data.
"""
[docs] def __init__(self, summary_dir: Union[str, Path]):
"""
Initialize the TensorboardLogger with a summary directory.
Parameters
----------
summary_dir : Union[str, Path]
The directory to store the Tensorboard summary files.
"""
self.summary_dir = Path(summary_dir).as_posix()
self.backend_logger = SummaryWriter(log_dir=summary_dir)
[docs] def add_image(self, k, v, itr, dataformats="CHW"):
"""
Add an image to the TensorBoard dashboard.
Parameters
----------
k : str
The tag associated with the image.
v : np.ndarray
The image data.
itr : int
The iteration number.
dataformats : str, optional
The format of the image data, by default ``"CHW"``.
"""
self.backend_logger.add_image(k, v, itr, dataformats=dataformats)
[docs] def add_table(self, k, v: pd.DataFrame, itr):
"""
Add a table to the TensorBoard dashboard.
Parameters
----------
k : str
The tag associated with the table.
v : pd.DataFrame
The table data.
itr : int
The iteration number.
"""
self.backend_logger.add_text(k, v.to_markdown(), itr)
[docs] def add_text(self, k, v, itr):
"""
Add a text to the TensorBoard dashboard.
Parameters
----------
k : str
The tag associated with the text.
v : str
The text data.
itr : int
The iteration number.
"""
self.backend_logger.add_text(k, v, itr)
[docs] def add_scalars(self, k, v: dict[str, float | int], itr):
"""
Add multiple scalars to the TensorBoard dashboard.
Parameters
----------
k : str
The main tag associated with the scalars.
v : dict[str, float | int]
A dictionary of scalar tags and values.
itr : int
The iteration number.
"""
for _k, _v in v.items():
self.backend_logger.add_scalar(f"{k}_{_k}", _v, itr)
# NOTE this is buggy:
# self.backend_logger.add_scalars(k, v_dict, itr)
[docs] def add_scalar(self, k, v, itr):
"""
Add a scalar to the TensorBoard dashboard.
Parameters
----------
k : str
The tag associated with the scalar.
v : float | int
The scalar value.
itr : int
The iteration number.
"""
if v is None:
self.backend_logger.add_scalar(k, np.nan, itr)
else:
self.backend_logger.add_scalar(k, v, itr)
[docs] def write_config(self, config: ConfigBase):
"""
Write the configuration to the TensorBoard dashboard.
Parameters
----------
config : ConfigBase
The configuration object.
"""
hparams = flatten_nested_dict(config.to_dict())
run_config = OmegaConf.to_yaml(OmegaConf.create(hparams)).replace("\n", "\n\n")
self.backend_logger.add_text("config", run_config, 0)
def _sync(self):
pass