Shortcuts

Source code for catalyst.metrics._additive

from typing import Tuple

import numpy as np

from catalyst.metrics._metric import IMetric


[docs]class AdditiveValueMetric(IMetric): """This metric computes mean and std values of input data. Args: compute_on_call: if True, computes and returns metric value during metric call """ def __init__(self, compute_on_call: bool = True): """Init AdditiveValueMetric""" super().__init__(compute_on_call=compute_on_call) self.n = 0 self.value = 0.0 self.mean = np.nan self.mean_old = 0.0 self.m_s = 0.0 self.std = np.nan self.num_samples = 0 def reset(self) -> None: """Reset all fields""" self.n = 0 self.value = 0.0 self.mean = np.nan self.mean_old = 0.0 self.m_s = 0.0 self.std = np.nan self.num_samples = 0 def update(self, value: float, num_samples: int) -> float: """Update mean metric value and std with new value. Args: value: value to update mean and std with num_samples: number of value samples that metrics should be updated with Returns: last value """ self.value = value self.n += 1 self.num_samples += num_samples if self.n == 1: # Force a copy in torch/numpy self.mean = 0.0 + value # noqa: WPS345 self.std = 0.0 self.mean_old = self.mean self.m_s = 0.0 else: self.mean = self.mean_old + (value - self.mean_old) * num_samples / float( self.num_samples ) self.m_s += (value - self.mean_old) * (value - self.mean) * num_samples self.mean_old = self.mean self.std = np.sqrt(self.m_s / (self.num_samples - 1.0)) return value def compute(self) -> Tuple[float, float]: """ Returns mean and std values of all the input data Returns: tuple of mean and std values """ return self.mean, self.std
__all__ = ["AdditiveValueMetric"]