Module ainshamsflow.initializers

Initializers Module.

In this Module, we include our Initializers such as Uniform or Normal Initializers.

Expand source code
"""Initializers Module.

In this Module, we include our Initializers such as
Uniform or Normal Initializers.
"""

import numpy as np

from ainshamsflow.utils.asf_errors import (BaseClassError, UnsupportedShapeError, NameNotFoundError,
                                                                                   InvalidRangeError)


def get(init_name):
        """Get any Initializer in this Module by name."""

        inits = [Constant, Uniform, Normal, Identity]
        for init in inits:
                if init.__name__.lower() == init_name.lower():
                        return init()
        raise NameNotFoundError(init_name, __name__)


class Initializer:
        """Initializer Base Class.

        To create a new Initializer, create a class that
        inherits from this class.
        You then have to add any parameters in your constructor
        and redefine the __call__() method.
        """

        def __call__(self, shape):
                raise BaseClassError


class Constant(Initializer):
        """Constant Value Initializer."""

        def __init__(self, value=0):
                self.value = value

        def __call__(self, shape):
                return np.full(shape, self.value)


class Uniform(Initializer):
        """Uniform Distribution Initializer."""

        def __init__(self, start=0, end=1):
                if not start < end:
                        raise InvalidRangeError(start, None, end)
                self.start = start
                self.range = end - start

        def __call__(self, shape):
                return self.range * np.random.rand(*shape) + self.start


class Normal(Initializer):
        """Normal (Gaussian) Distribution Initializer."""

        def __init__(self, mean=0, std=0.1):
                if not std > 0:
                        raise InvalidRangeError(std, 0)
                self.mean = mean
                self.std = std

        def __call__(self, shape):
                return np.random.normal(self.mean, self.std, shape)


class Identity(Initializer):
        """Identity Matrix Initializer."""

        def __init__(self, gain=1):
                self.gain = gain

        def __call__(self, shape):
                if isinstance(shape, int):
                        return self.gain * np.eye(shape)
                elif len(shape) == 2:
                        return self.gain * np.eye(*shape)
                else:
                        raise UnsupportedShapeError(shape, 'N or (N, M)')

Functions

def get(init_name)

Get any Initializer in this Module by name.

Expand source code
def get(init_name):
        """Get any Initializer in this Module by name."""

        inits = [Constant, Uniform, Normal, Identity]
        for init in inits:
                if init.__name__.lower() == init_name.lower():
                        return init()
        raise NameNotFoundError(init_name, __name__)

Classes

class Constant (value=0)

Constant Value Initializer.

Expand source code
class Constant(Initializer):
        """Constant Value Initializer."""

        def __init__(self, value=0):
                self.value = value

        def __call__(self, shape):
                return np.full(shape, self.value)

Ancestors

class Identity (gain=1)

Identity Matrix Initializer.

Expand source code
class Identity(Initializer):
        """Identity Matrix Initializer."""

        def __init__(self, gain=1):
                self.gain = gain

        def __call__(self, shape):
                if isinstance(shape, int):
                        return self.gain * np.eye(shape)
                elif len(shape) == 2:
                        return self.gain * np.eye(*shape)
                else:
                        raise UnsupportedShapeError(shape, 'N or (N, M)')

Ancestors

class Initializer

Initializer Base Class.

To create a new Initializer, create a class that inherits from this class. You then have to add any parameters in your constructor and redefine the call() method.

Expand source code
class Initializer:
        """Initializer Base Class.

        To create a new Initializer, create a class that
        inherits from this class.
        You then have to add any parameters in your constructor
        and redefine the __call__() method.
        """

        def __call__(self, shape):
                raise BaseClassError

Subclasses

class Normal (mean=0, std=0.1)

Normal (Gaussian) Distribution Initializer.

Expand source code
class Normal(Initializer):
        """Normal (Gaussian) Distribution Initializer."""

        def __init__(self, mean=0, std=0.1):
                if not std > 0:
                        raise InvalidRangeError(std, 0)
                self.mean = mean
                self.std = std

        def __call__(self, shape):
                return np.random.normal(self.mean, self.std, shape)

Ancestors

class Uniform (start=0, end=1)

Uniform Distribution Initializer.

Expand source code
class Uniform(Initializer):
        """Uniform Distribution Initializer."""

        def __init__(self, start=0, end=1):
                if not start < end:
                        raise InvalidRangeError(start, None, end)
                self.start = start
                self.range = end - start

        def __call__(self, shape):
                return self.range * np.random.rand(*shape) + self.start

Ancestors