Source code for mygrad.nnet.initializers.normal
import numpy as np
from mygrad.tensor_base import Tensor
[docs]def normal(*shape, mean=0, std=1, dtype=np.float32, constant=None):
"""Initialize a :class:`mygrad.Tensor` by drawing from a normal (Gaussian) distribution.
Parameters
----------
shape : Sequence[int]
The output shape.
mean : Real, optional (default=0)
The mean of the distribution from which to draw.
std : Real, optional (default=1)
The standard deviation of the distribution from which to draw.
dtype : data-type, optional (default=float32)
The data type of the output tensor; must be a floating-point type.
constant : bool, optional (default=False)
If ``True``, the returned tensor is a constant (it
does not back-propagate a gradient).
Returns
-------
mygrad.Tensor, shape=``shape``
A Tensor, with values drawn from Ɲ(μ, σ²), where μ=``mean`` and σ=``std``.
Examples
--------
>>> from mygrad.nnet.initializers import normal
>>> normal(1, 2, 3)
Tensor([[[-0.06481607, -0.550582 , 0.04689528],
[ 0.82973075, 2.83742 , 1.0964519 ]]], dtype=float32)
>>> normal(2, 2, dtype="float16", constant=True)
Tensor([[-1.335 , 0.9297],
[ 1.746 , -0.1222]], dtype=float16)
>>> normal(5, dtype="float64")
Tensor([-0.03875407, 0.65368466, -0.72636993, 1.57404148, -1.17444345])
"""
if not np.issubdtype(dtype, np.floating):
raise ValueError("Normal initialization requires a floating-point dtype")
if std < 0:
raise ValueError("Standard deviation must be non-negative")
if len(shape) == 1:
shape = shape[0]
if isinstance(mean, Tensor):
mean = mean.item()
if isinstance(std, Tensor):
std = std.item()
return Tensor(
np.random.normal(mean, std, shape),
dtype=dtype,
constant=constant,
copy=False,
)