Source code for chainer.initializers.normal

import numpy

from chainer import cuda
from chainer import initializer


# Original code forked from MIT licensed keras project
# https://github.com/fchollet/keras/blob/master/keras/initializations.py

[docs]class Normal(initializer.Initializer): """Initializes array with a normal distribution. Each element of the array is initialized by the value drawn independently from Gaussian distribution whose mean is 0, and standard deviation is ``scale``. Args: scale(float): Standard deviation of Gaussian distribution. dtype: Data type specifier. """ def __init__(self, scale=0.05, dtype=None): self.scale = scale super(Normal, self).__init__(dtype) def __call__(self, array): xp = cuda.get_array_module(array) args = {'loc': 0.0, 'scale': self.scale, 'size': array.shape} if xp is not numpy: # Only CuPy supports dtype option if self.dtype == numpy.float32 or self.dtype == numpy.float16: # float16 is not supported in cuRAND args['dtype'] = numpy.float32 array[...] = xp.random.normal(**args)
[docs]class GlorotNormal(initializer.Initializer): """Initializes array with scaled Gaussian distribution. Each element of the array is initialized by the value drawn independently from Gaussian distribution whose mean is 0, and standard deviation is :math:`scale \\times \\sqrt{\\frac{2}{fan_{in} + fan_{out}}}`, where :math:`fan_{in}` and :math:`fan_{out}` are the number of input and output units, respectively. Reference: Glorot & Bengio, AISTATS 2010 Args: scale (float): A constant that determines the scale of the standard deviation. dtype: Data type specifier. """ def __init__(self, scale=1.0, dtype=None): self.scale = scale super(GlorotNormal, self).__init__(dtype) def __call__(self, array): if self.dtype is not None: assert array.dtype == self.dtype fan_in, fan_out = initializer.get_fans(array.shape) s = self.scale * numpy.sqrt(2. / (fan_in + fan_out)) Normal(s)(array)
[docs]class HeNormal(initializer.Initializer): """Initializes array with scaled Gaussian distribution. Each element of the array is initialized by the value drawn independently from Gaussian distribution whose mean is 0, and standard deviation is :math:`scale \\times \\sqrt{\\frac{2}{fan_{in}}}`, where :math:`fan_{in}` is the number of input units. Reference: He et al., https://arxiv.org/abs/1502.01852 Args: scale (float): A constant that determines the scale of the standard deviation. dtype: Data type specifier. """ def __init__(self, scale=1.0, dtype=None): self.scale = scale super(HeNormal, self).__init__(dtype) def __call__(self, array): if self.dtype is not None: assert array.dtype == self.dtype fan_in, fan_out = initializer.get_fans(array.shape) s = self.scale * numpy.sqrt(2. / fan_in) Normal(s)(array)