module mod_activation ! A collection of activation functions and their derivatives. use mod_kinds, only: ik, rk implicit none private public :: activation_function public :: gaussian, gaussian_prime public :: relu, relu_prime public :: sigmoid, sigmoid_prime public :: step, step_prime public :: tanhf, tanh_prime interface pure function activation_function(x) import :: rk real(rk), intent(in) :: x(:) real(rk) :: activation_function(size(x)) end function activation_function end interface contains pure function gaussian(x) result(res) ! Gaussian activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = exp(-x**2) end function gaussian pure function gaussian_prime(x) result(res) ! First derivative of the Gaussian activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = -2 * x * gaussian(x) end function gaussian_prime pure function relu(x) result(res) !! REctified Linear Unit (RELU) activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = max(0., x) end function relu pure function relu_prime(x) result(res) ! First derivative of the REctified Linear Unit (RELU) activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) where (x > 0) res = 1 elsewhere res = 0 end where end function relu_prime pure function sigmoid(x) result(res) ! Sigmoid activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = 1 / (1 + exp(-x)) endfunction sigmoid pure function sigmoid_prime(x) result(res) ! First derivative of the sigmoid activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = sigmoid(x) * (1 - sigmoid(x)) end function sigmoid_prime pure function step(x) result(res) ! Step activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) where (x > 0) res = 1 elsewhere res = 0 end where end function step pure function step_prime(x) result(res) ! First derivative of the step activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = 0 end function step_prime pure function tanhf(x) result(res) ! Tangent hyperbolic activation function. ! Same as the intrinsic tanh, but must be ! defined here so that we can use procedure ! pointer with it. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = tanh(x) end function tanhf pure function tanh_prime(x) result(res) ! First derivative of the tanh activation function. real(rk), intent(in) :: x(:) real(rk) :: res(size(x)) res = 1 - tanh(x)**2 end function tanh_prime end module mod_activation