Source code for catalyst.utils.numpy

from typing import Dict  # isort:skip

import numpy as np
from scipy.signal import lfilter


[docs]def np_softmax(x): e_x = np.exp(x - np.max(x)) return e_x / e_x.sum(axis=-1)
[docs]def geometric_cumsum(alpha, x): """ Calculate future accumulated sums for each element in a list with an exponential factor. Given input data :math:`x_1, \dots, x_n` # noqa: E501, W605 and exponential factor :math:`\alpha\in [0, 1]`, # noqa: E501, W605 it returns an array :math:`y` with the same length and each element is calculated as following .. math:: y_i = x_i + \alpha x_{i+1} + \alpha^2 x_{i+2} + \dots + \alpha^{n-i-1}x_{n-1} + \alpha^{n-i}x_{n} # noqa: E501, W605 .. note:: To gain the optimal runtime speed, we use ``scipy.signal.lfilter`` Example: >>> geometric_cumsum(0.1, [[1, 1], [2, 2], [3, 3], [4, 4]]) array([[1.234, 1.234], [2.34 , 2.34 ], [3.4 , 3.4 ], [4. , 4. ]]) Args: alpha (float): exponential factor between zero and one. x (np.ndarray): input data, [trajectory_len, num_atoms] Returns: out (np.ndarray): calculated data source: https://github.com/zuoxingdong/lagom """ x = np.asarray(x) assert x.ndim == 2 return lfilter([1], [1, -alpha], x[::-1, :], axis=0)[::-1, :]
[docs]def structed2dict(array: np.ndarray): if isinstance(array, (np.ndarray, np.void)) \ and array.dtype.fields is not None: array = {key: array[key] for key in array.dtype.fields.keys()} return array
[docs]def dict2structed(array: Dict): if isinstance(array, dict): capacity = 0 dtype = [] for key, value in array.items(): capacity = len(value) dtype.append((key, value.dtype, value.shape[1:])) dtype = np.dtype(dtype) array_ = np.empty(capacity, dtype=dtype) for key, value in array.items(): array_[key] = value array = array_ return array
[docs]def get_one_hot( label: int, num_classes: int, smoothing: float = None ) -> np.ndarray: """ Applies OneHot vectorization to a giving scalar, optional with label smoothing from https://arxiv.org/abs/1812.01187 Args: label (int): scalar value to be vectorized num_classes (int): total number of classes smoothing (float, optional): if specified applies label smoothing from ``Bag of Tricks for Image Classification with Convolutional Neural Networks`` paper Returns: np.ndarray: a one-hot vector with shape ``(num_classes,)`` """ assert num_classes is not None and num_classes > 0, \ f"Expect num_classes to be > 0, got {num_classes}" assert label is not None and 0 <= label < num_classes, \ f"Expect label to be in [0; {num_classes}), got {label}" if smoothing is not None: assert 0.0 < smoothing < 1.0, \ f"If smoothing is specified it must be in (0; 1), got {smoothing}" smoothed = smoothing / float(num_classes - 1) result = np.full((num_classes, ), smoothed, dtype=np.float32) result[label] = 1.0 - smoothing return result result = np.zeros(num_classes, dtype=np.float32) result[label] = 1.0 return result