Source code for catalyst.dl.callbacks.metrics.accuracy
from typing import List
from catalyst.core import MultiMetricCallback
from catalyst.utils import metrics
def _get_default_accuracy_args(num_classes: int) -> List[int]:
"""Calculate list params for ``Accuracy@k`` and ``mAP@k``.
Examples:
>>> _get_default_accuracy_args(num_classes=4)
>>> [1, 3]
>>> _get_default_accuracy_args(num_classes=8)
>>> [1, 3, 5]
Args:
num_classes (int): number of classes
Returns:
iterable: array of accuracy arguments
"""
result = [1]
if num_classes is None:
return result
if num_classes > 3:
result.append(3)
if num_classes > 5:
result.append(5)
return result
[docs]class AccuracyCallback(MultiMetricCallback):
"""Accuracy metric callback.
It can be used either for
- multi-class task:
-you can use accuracy_args.
-threshold and activation are not required.
-input_key point on tensor: batch_size.
-output_key point on tensor: batch_size x num_classes.
- OR multi-label task, in this case:
-you must specify threshold and activation.
-accuracy_args and num_classes will not be used
(because of there is no method to apply top-k in
multi-label classification).
-input_key, output_key point on tensor: batch_size x num_classes.
-output_key point on a tensor with binary vectors.
.. note::
There is no need to choose a type (multi-class/multi label).
An appropriate type will be chosen automatically via shape of tensors.
"""
[docs] def __init__(
self,
input_key: str = "targets",
output_key: str = "logits",
prefix: str = "accuracy",
accuracy_args: List[int] = None,
num_classes: int = None,
threshold: float = None,
activation: str = None,
):
"""
Args:
input_key (str): input key to use for accuracy calculation;
specifies our `y_true`
output_key (str): output key to use for accuracy calculation;
specifies our `y_pred`
prefix (str): key for the metric's name
accuracy_args (List[int]): specifies which accuracy@K to log:
[1] - accuracy
[1, 3] - accuracy at 1 and 3
[1, 3, 5] - accuracy at 1, 3 and 5
num_classes (int): number of classes to calculate ``accuracy_args``
if ``accuracy_args`` is None
threshold (float): threshold for outputs binarization.
activation (str): An torch.nn activation applied to the outputs.
Must be one of ``"none"``, ``"Sigmoid"``, or ``"Softmax"``
"""
list_args = accuracy_args or _get_default_accuracy_args(num_classes)
super().__init__(
prefix=prefix,
metric_fn=metrics.accuracy,
list_args=list_args,
input_key=input_key,
output_key=output_key,
topk=list_args,
threshold=threshold,
activation=activation,
)
[docs]class MapKCallback(MultiMetricCallback):
"""mAP@k metric callback."""
[docs] def __init__(
self,
input_key: str = "targets",
output_key: str = "logits",
prefix: str = "map",
map_args: List[int] = None,
num_classes: int = None,
):
"""
Args:
input_key (str): input key to use for
calculation mean average accuracy at k;
specifies our `y_true`
output_key (str): output key to use for
calculation mean average accuracy at k;
specifies our `y_pred`
prefix (str): key for the metric's name
map_args (List[int]): specifies which map@K to log.
[1] - map@1
[1, 3] - map@1 and map@3
[1, 3, 5] - map@1, map@3 and map@5
num_classes (int): number of classes to calculate ``map_args``
if ``map_args`` is None
"""
list_args = map_args or _get_default_accuracy_args(num_classes)
super().__init__(
prefix=prefix,
metric_fn=metrics.mean_average_accuracy,
list_args=list_args,
input_key=input_key,
output_key=output_key,
topk=list_args,
)
__all__ = ["AccuracyCallback", "MapKCallback"]