Source code for mygrad.nnet.activations.relu
from typing import Optional
import numpy as np
from mygrad.operation_base import Operation
from mygrad.tensor_base import Tensor
from mygrad.typing import ArrayLike
class ReLu(Operation):
def __call__(self, a):
self.variables = (a,)
self.back = np.asarray(a > 0, dtype=a.dtype)
return a.data * self.back
def backward_var(self, grad, index, **kwargs):
return grad * self.back
[docs]def relu(x: ArrayLike, *, constant: Optional[bool] = None) -> Tensor:
"""
Applies the recitfied linear unit activation function::
f(x) = {x, x > 0
0, x <= 0 }
Parameters
----------
x : ArrayLike
relu is applied element-wise on ``x``.
constant : Optional[bool]
If ``True``, the returned tensor is a constant (it
does not back-propagate a gradient)
Returns
-------
mygrad.Tensor
Examples
--------
>>> import mygrad as mg
>>> from mygrad.nnet import relu
>>> x = mg.linspace(-5, 5, 5)
>>> x
Tensor([-5. , -2.5, 0. , 2.5, 5. ])
>>> relu(x)
Tensor([-0. , -0. , 0. , 2.5, 5. ])
>>> relu(x).backward()
>>> x.grad # d(relu(x))/dx
array([0., 0., 0., 1., 1.])
.. plot::
>>> import mygrad as mg
>>> from mygrad.nnet.activations import relu
>>> import matplotlib.pyplot as plt
>>> x = mg.linspace(-2, 2, 100)
>>> y = relu(x)
>>> plt.title("relu(x)")
>>> y.backward()
>>> plt.plot(x, x.grad, label="df/dx")
>>> plt.plot(x, y, label="f(x)")
>>> plt.legend()
>>> plt.grid()
>>> plt.show()
"""
return Tensor._op(ReLu, x, constant=constant)