Source code for mlprodict.onnxrt.ops_cpu.op_normalizer

# -*- encoding: utf-8 -*-
# pylint: disable=E0203,E1101,C0111
"""
Runtime operator.


:githublink:`%|py|7`
"""
import numpy
from ._op import OpRunUnaryNum


[docs]class Normalizer(OpRunUnaryNum): atts = {'norm': 'MAX'}
[docs] def __init__(self, onnx_node, desc=None, **options): OpRunUnaryNum.__init__(self, onnx_node, desc=desc, expected_attributes=Normalizer.atts, **options) if self.norm == b'MAX': # pylint: disable=E1101 self._norm = Normalizer.norm_max elif self.norm == b'L1': # pylint: disable=E1101 self._norm = Normalizer.norm_l1 elif self.norm == b'L2': # pylint: disable=E1101 self._norm = Normalizer.norm_l2 else: raise ValueError( # pragma: no cover "Unexpected value for norm='{}'.".format(self.norm)) # pylint: disable=E1101
[docs] @staticmethod def norm_max(x, inplace): "max normalization" if inplace: return Normalizer._norm_max_inplace(x) return x / numpy.abs(x).max(axis=1).reshape((x.shape[0], -1))
[docs] @staticmethod def _norm_max_inplace(x): numpy.divide(x, numpy.abs(x).max(axis=1).reshape((x.shape[0], -1)), out=x) return x
[docs] @staticmethod def norm_l1(x, inplace): "L1 normalization" if inplace: return Normalizer._norm_L1_inplace(x) return x / numpy.abs(x).sum(axis=1).reshape((x.shape[0], -1))
[docs] @staticmethod def _norm_L1_inplace(x): numpy.divide(x, numpy.abs(x).sum(axis=1).reshape((x.shape[0], -1)), out=x) return x
[docs] @staticmethod def norm_l2(x, inplace): "L2 normalization" xn = numpy.square(x).sum(axis=1) numpy.sqrt(xn, out=xn) norm = xn.reshape((x.shape[0], -1)) if inplace: numpy.divide(x, norm, out=x) return x return x / norm
[docs] def _run(self, x): # pylint: disable=W0221 return (self._norm(x, inplace=self.inplaces.get(0, False)), )