Skip to content

_random_normal_like

random_normal_like

Generate noise shaped like tensor from a random normal distribution with a given mean and std.

This method can be used with Numpy data:

n = np.array([[0,1],[2,3]])
b = fe.backend.random_normal_like(n)  # [[-0.6, 0.2], [1.9, -0.02]]
b = fe.backend.random_normal_like(n, mean=5.0)  # [[3.7, 5.7], [5.6, 3.6]]

This method can be used with TensorFlow tensors:

t = tf.constant([[0,1],[2,3]])
b = fe.backend.random_normal_like(t)  # [[-0.6, 0.2], [1.9, -0.02]]
b = fe.backend.random_normal_like(t, mean=5.0)  # [[3.7, 5.7], [5.6, 3.6]]

This method can be used with PyTorch tensors:

p = torch.tensor([[0,1],[2,3]])
b = fe.backend.random_normal_like(p)  # [[-0.6, 0.2], [1.9, -0.02]]
b = fe.backend.random_normal_like(P, mean=5.0)  # [[3.7, 5.7], [5.6, 3.6]]

Parameters:

Name Type Description Default
tensor Tensor

The tensor whose shape will be copied.

required
mean float

The mean of the normal distribution to be sampled.

0.0
std float

The standard deviation of the normal distribution to be sampled.

1.0
dtype Union[None, str]

The data type to be used when generating the resulting tensor. This should be one of the floating point types.

'float32'

Returns:

Type Description
Tensor

A tensor of random normal noise with the same shape as tensor.

Raises:

Type Description
ValueError

If tensor is an unacceptable data type.

Source code in fastestimator/fastestimator/backend/_random_normal_like.py
def random_normal_like(tensor: Tensor, mean: float = 0.0, std: float = 1.0,
                       dtype: Union[None, str] = 'float32') -> Tensor:
    """Generate noise shaped like `tensor` from a random normal distribution with a given `mean` and `std`.

    This method can be used with Numpy data:
    ```python
    n = np.array([[0,1],[2,3]])
    b = fe.backend.random_normal_like(n)  # [[-0.6, 0.2], [1.9, -0.02]]
    b = fe.backend.random_normal_like(n, mean=5.0)  # [[3.7, 5.7], [5.6, 3.6]]
    ```

    This method can be used with TensorFlow tensors:
    ```python
    t = tf.constant([[0,1],[2,3]])
    b = fe.backend.random_normal_like(t)  # [[-0.6, 0.2], [1.9, -0.02]]
    b = fe.backend.random_normal_like(t, mean=5.0)  # [[3.7, 5.7], [5.6, 3.6]]
    ```

    This method can be used with PyTorch tensors:
    ```python
    p = torch.tensor([[0,1],[2,3]])
    b = fe.backend.random_normal_like(p)  # [[-0.6, 0.2], [1.9, -0.02]]
    b = fe.backend.random_normal_like(P, mean=5.0)  # [[3.7, 5.7], [5.6, 3.6]]
    ```

    Args:
        tensor: The tensor whose shape will be copied.
        mean: The mean of the normal distribution to be sampled.
        std: The standard deviation of the normal distribution to be sampled.
        dtype: The data type to be used when generating the resulting tensor. This should be one of the floating point
            types.

    Returns:
        A tensor of random normal noise with the same shape as `tensor`.

    Raises:
        ValueError: If `tensor` is an unacceptable data type.
    """
    if tf.is_tensor(tensor):
        return tf.random.normal(shape=tensor.shape, mean=mean, stddev=std, dtype=dtype)
    elif isinstance(tensor, torch.Tensor):
        return torch.randn_like(tensor, dtype=STRING_TO_TORCH_DTYPE[dtype]) * std + mean
    elif isinstance(tensor, np.ndarray):
        return np.random.normal(loc=mean, scale=std, size=tensor.shape).astype(dtype=dtype)
    else:
        raise ValueError("Unrecognized tensor type {}".format(type(tensor)))