Commit c1de31dd authored by Michal Kravcenko's avatar Michal Kravcenko

polished documentation and finished all Neuron classes

parent 3c0ec38b
......@@ -5,32 +5,32 @@
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="Makefile" value="1" />
<entry key="cpp" value="15" />
<entry key="f90" value="1" />
<entry key="h" value="13" />
<entry key="cpp" value="29" />
<entry key="f90" value="2" />
<entry key="h" value="27" />
<entry key="txt" value="4" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="CMakeLists.txt" value="4" />
<entry key="ObjectiveC" value="28" />
<entry key="PLAIN_TEXT" value="2" />
<entry key="ObjectiveC" value="56" />
<entry key="PLAIN_TEXT" value="3" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="cpp" value="1455" />
<entry key="h" value="2890" />
<entry key="txt" value="250" />
<entry key="cpp" value="2096" />
<entry key="h" value="3432" />
<entry key="txt" value="290" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="CMakeLists.txt" value="112" />
<entry key="Doxygen file" value="38" />
<entry key="ObjectiveC" value="4307" />
<entry key="PLAIN_TEXT" value="138" />
<entry key="Doxygen file" value="39" />
<entry key="ObjectiveC" value="5489" />
<entry key="PLAIN_TEXT" value="178" />
</counts>
</usages-collector>
</session>
......
add_library(neuron SHARED Neuron/neuron.cpp Neuron/neuron.h Neuron/NeuronBinary.cpp Neuron/NeuronBinary.h Neuron/NeuronLinear.cpp Neuron/NeuronLinear.h Neuron/NeuronLogistic.cpp Neuron/NeuronLogistic.h Neuron/NeuronTanh.cpp Neuron/NeuronTanh.h constants.h)
add_library(neuron SHARED Neuron/Neuron.cpp Neuron/Neuron.h Neuron/NeuronBinary.cpp Neuron/NeuronBinary.h Neuron/NeuronLinear.cpp Neuron/NeuronLinear.h Neuron/NeuronLogistic.cpp Neuron/NeuronLogistic.h Neuron/NeuronTanh.cpp Neuron/NeuronTanh.h constants.h)
#include "neuron.h"
#include "Neuron.h"
Neuron::~Neuron() {
if(this->activation_function_parameters){
......
......@@ -49,7 +49,7 @@ public:
/**
* Performs the activation function and stores the result into the 'state' property
*/
virtual void activate() = 0;
virtual void activate( ) = 0;
/**
* Adds the input signal value to the current potential
......@@ -65,7 +65,7 @@ public:
/**
* Setter to the 'potential' property
* @param value Value of the neuron's potential (real number)
* @param[in] value Value of the neuron's potential (real number)
*/
virtual void set_potential(double value);
......@@ -77,7 +77,7 @@ public:
/**
* Setter to the 'state' component
* @param value Value of the current neuron's state
* @param[in] value Value of the current neuron's state
*/
virtual void set_state(double value);
......@@ -90,7 +90,7 @@ public:
/**
* Calculates the partial derivative of the activation function
* with respect to the parameter and the current potential
* @param param_idx Index of the parameter to calculate derivative of
* @param[in] param_idx Index of the parameter to calculate derivative of
* @return Partial derivative of the activation function according to the
* 'param_idx'-th parameter
*/
......@@ -105,22 +105,22 @@ public:
/**
* Adjusts the parameter with index 'param_idx' of the activation function
* by the value prescribed by 'value'
* @param param_idx Index of the parameter to be adjusted
* @param value Value of the adjustment
* @param[in] param_idx Index of the parameter to be adjusted
* @param[in] value Value of the adjustment
*/
virtual void activation_function_adjust_parameter(int param_idx, double value);
/**
* Sets the parameter with index 'param_idx' of the activation function
* to the value prescribed by 'value'
* @param param_idx
* @param value
* @param[in] param_idx
* @param[in] value
*/
virtual void activation_function_set_parameter(int param_idx, double value);
/**
* Gets the parameter with index 'param_idx' of the activation function
* @param param_idx
* @param[in] param_idx
*/
virtual double activation_function_get_parameter(int param_idx);
......
......@@ -9,9 +9,12 @@ NeuronBinary::NeuronBinary(double threshold) {
this->activation_function_parameters[0] = threshold;
}
void NeuronBinary::activate() {
void NeuronBinary::activate( ) {
if(this->potential >= this->activation_function_parameters[0]){
double x = this->potential;
double threshold = this->activation_function_parameters[0];
if(x >= threshold){
this->state = 1.0;
}
else{
......
......@@ -5,7 +5,7 @@
#ifndef INC_4NEURO_NEURONBINARY_H
#define INC_4NEURO_NEURONBINARY_H
#include "neuron.h"
#include "Neuron.h"
/**
* Binary neuron class - uses unit-step as the activation function
......@@ -17,7 +17,7 @@ public:
/**
* Default constructor for the binary Neuron
* @param threshold Denotes when the neuron is activated
* @param[in] threshold Denotes when the neuron is activated
* When neuron potential exceeds 'threshold' value it becomes excited
*/
explicit NeuronBinary(double threshold = 0.0);
......@@ -25,45 +25,10 @@ public:
/**
* Performs the activation function and stores the result into the 'state' property
*/
void activate() override;
void activate( ) override;
};
#endif //INC_4NEURO_NEURONBINARY_H
/*
!-----------------------!----------------------------------------------------------------------
! class binary_neuron_t !
!-----------------------!
!> Binary neuron class - uses unit-step as the activation function
type, extends(neuron_t) :: binary_neuron_t
private
real(kind=real_4neuro) :: threshold !< When neuron potential exceeds this value, neuron becomes excited
contains
!> Activation function - transforms potential into the output state value
!! AND assigns it into the 'state' component
!!
!! Unit-step function - (returns 1 for potential > threshold, otherwise returns 0)
procedure, private :: activate => unit_step_activate_impl
end type binary_neuron_t
interface binary_neuron_t
!> Non-parametric constructor of binary_neuron_t class (threshold
!! will be initialized by a random number from Gaussian distribution)
!! @return An instance of the class binary_neuron_t
module procedure :: new_binary_neuron
!> Parametric constructor of binary_neuron_t class
!! @param[in] threshold Threshold for the unit-step activation function
!! @return An instance of the class binary_neuron_t
module procedure :: new_binary_neuron_1
end interface binary_neuron_t
*/
\ No newline at end of file
......@@ -13,22 +13,31 @@ NeuronLinear::NeuronLinear(double a, double b) {
}
void NeuronLinear::activate() {
void NeuronLinear::activate( ) {
this->state = this->activation_function_parameters[0] * this->potential + this->activation_function_parameters[1];
double x = this->potential;
double a = this->activation_function_parameters[0];
double b = this->activation_function_parameters[1];
this->state = b * x + a;
}
double NeuronLinear::activation_function_get_partial_derivative(int param_idx) {
if(param_idx == 0){
return this->potential;
}
else{
return 1.0;
}
else if(param_idx == 1){
double x = this->potential;
return x;
}
return 0.0;
}
double NeuronLinear::activation_function_get_derivative() {
return this->activation_function_parameters[0];
double NeuronLinear::activation_function_get_derivative( ) {
double b = this->activation_function_parameters[1];
return b;
}
\ No newline at end of file
......@@ -5,7 +5,7 @@
#ifndef INC_4NEURO_NEURONLINEAR_H
#define INC_4NEURO_NEURONLINEAR_H
#include "neuron.h"
#include "Neuron.h"
/**
* Linear neuron class - uses activation function in the form f(x)=a*x + b,
......@@ -16,21 +16,21 @@ public:
/**
* Constructs the object of the Linear neuron with activation function
* f(x) = a * x + b
* @param a First coefficient, stored in activation_function_parameters[0]
* @param b Second coefficient, stored in activation_function_parameters[1]
* f(x) = b * x + a
* @param[in] a First coefficient, stored in activation_function_parameters[0]
* @param[in] b Second coefficient, stored in activation_function_parameters[1]
*/
explicit NeuronLinear(double a = 0.0, double b = 0.0);
/**
* Evaluates 'a*x + b' and stores the result into the 'state' property
* Evaluates 'b*x + a' and stores the result into the 'state' property
*/
void activate() override;
void activate( ) override;
/**
* Calculates the partial derivative of the activation function
* f(x) = a*x + b
* @param param_idx Index of the parameter to calculate derivative of
* f(x) = b*x + a
* @param[in] param_idx Index of the parameter to calculate derivative of
* @return Partial derivative of the activation function according to the
* 'param_idx'-th parameter. For 'param_idx'=0 returns 'x', otherwise
* returns 1
......@@ -38,10 +38,10 @@ public:
double activation_function_get_partial_derivative(int param_idx) override;
/**
* Calculates d/dx of (a*x + b)
* @return a
* Calculates d/dx of (b*x + a)
* @return b
*/
double activation_function_get_derivative() override;
double activation_function_get_derivative( ) override;
};
......
......@@ -13,48 +13,50 @@ NeuronLogistic::NeuronLogistic(double a, double b) {
this->activation_function_parameters[1] = b;
}
void NeuronLogistic::activate() {
void NeuronLogistic::activate( ) {
double a = this->activation_function_parameters[0];
double b = this->activation_function_parameters[1];
double x = this->potential;
double ex = std::pow(E, b - x);
this->state = std::pow(1.0 + ex, -a);
double ex = std::pow(E, a - x);
this->state = std::pow(1.0 + ex, -b);
}
double NeuronLogistic::activation_function_get_partial_derivative(int param_idx) {
double NeuronLogistic::activation_function_get_partial_derivative(int param_idx ) {
double a = this->activation_function_parameters[0];
double b = this->activation_function_parameters[1];
double x = this->potential;
if(param_idx == 0){
double ex = std::pow(E, b - x);
double ex = std::pow(E, a - x);
double exa= -std::pow(ex + 1.0, -a);
double exa= -std::pow(ex + 1.0, -b);
return exa * std::log(ex + 1.0);
}
else{
else if(param_idx == 1){
double ex = std::pow(E, b - x);
double ex2 = std::pow(ex + 1.0, -a - 1.0);
double ex = std::pow(E, a - x);
double ex2 = std::pow(ex + 1.0, -b - 1.0);
return -a * ex * ex2;
return -b * ex * ex2;
}
return 0.0;
}
double NeuronLogistic::activation_function_get_derivative() {
double NeuronLogistic::activation_function_get_derivative( ) {
double a = this->activation_function_parameters[0];
double b = this->activation_function_parameters[1];
double x = this->potential;
double ex = std::pow(E, b - x);
double ex2 = std::pow(ex + 1.0, -a - 1.0);
double ex = std::pow(E, a - x);
double ex2 = std::pow(ex + 1.0, -b - 1.0);
return a * ex * ex2;
return b * ex * ex2;
}
\ No newline at end of file
......@@ -6,69 +6,38 @@
#define INC_4NEURO_NEURONLOGISTIC_H
#include <cmath>
#include "neuron.h"
#include "Neuron.h"
#include "../constants.h"
class NeuronLogistic:Neuron {
/**
* Constructs the object of the Logistic neuron with activation function
* f(x) = (1 + e^(-x + b))^(-a)
* @param a First coefficient, stored in activation_function_parameters[0]
* @param b Second coefficient, stored in activation_function_parameters[1]
* @param[in] a First coefficient, stored in activation_function_parameters[0]
* @param[in] b Second coefficient, stored in activation_function_parameters[1]
*/
explicit NeuronLogistic(double a = 0.0, double b = 0.0);
/**
* Evaluates '(1 + e^(-x + b))^(-a)' and stores the result into the 'state' property
* Evaluates '(1 + e^(-x + a))^(-b)' and stores the result into the 'state' property
*/
void activate() override;
void activate( ) override;
/**
* Calculates the partial derivative of the activation function
* f(x) = (1 + e^(-x + b))^(-a)
* @param param_idx Index of the parameter to calculate derivative of
* f(x) = (1 + e^(-x + a))^(-b)
* @param[in] param_idx Index of the parameter to calculate derivative of
* @return Partial derivative of the activation function according to the
* 'param_idx'-th parameter.
*/
double activation_function_get_partial_derivative(int param_idx) override;
/**
* Calculates d/dx of (1 + e^(-x + b))^(-a)
* @return a * e^(b - x) * [e^(b - x) + 1]^(-a)
* Calculates d/dx of (1 + e^(-x + a))^(-b)
* @return b * e^(a - x) * [e^(a - x) + 1]^(-b)
*/
double activation_function_get_derivative() override;
double activation_function_get_derivative( ) override;
};
#endif //INC_4NEURO_NEURONLOGISTIC_H
/*
!-------------------------!--------------------------------------------------------------------
! class logistic_neuron_t !
!-------------------------!
!> Logistic neuron class - uses generalised logistic function as an activation function
!! in the form f(x) = (1 + e^(-x))^(-alpha),
!! 'x' being the neuron potential here
type, extends(neuron_t) :: logistic_neuron_t
private
real(kind=real_4neuro) :: alpha_coef !< The alpha coefficient used in the activation function
contains
!> Activation function - generalised logistic f.
procedure, private :: activate => logistic_activate_impl
end type logistic_neuron_t
interface logistic_neuron_t
!> Non-parametric constructor of logistic_neuron_t class
!! Alpha coefficient is set to 1
!! @return An instance of the class logistic_neuron_t
module procedure :: new_logistic_neuron
!> Constructor of the logistic_neuron_t class
!! @param[in] alpha_coef Alpha coefficient in the logistic activation function
!! @return An instance of the class logistic_neuron_t
module procedure :: new_logistic_neuron_1
end interface logistic_neuron_t
*/
\ No newline at end of file
......@@ -3,3 +3,47 @@
//
#include "NeuronTanh.h"
NeuronTanh::NeuronTanh(double a) {
this->activation_function_parameters = new double[1];
this->activation_function_parameters[0] = a;
}
void NeuronTanh::activate( ) {
double a = this->activation_function_parameters[0];
double x = this->potential;
double ex = std::pow(E, x - a);
double exi = 1.0 / ex;
this->state = (ex - exi) / (ex + exi);
}
double NeuronTanh::activation_function_get_partial_derivative(int param_idx) {
double a = this->activation_function_parameters[0];
double x = this->potential;
if(param_idx == 0){
double ex = -4.0 * std::pow(E, 2.0 * (x + a));
double exi = std::pow(E, 2.0 * a) + std::pow(E, 2.0 * x);
return ex / (exi * exi);
}
return 0.0;
}
double NeuronTanh::activation_function_get_derivative( ) {
double a = this->activation_function_parameters[0];
double x = this->potential;
double ex = -4.0 * std::pow(E, 2.0 * (x + a));
double exi = std::pow(E, 2.0 * a) + std::pow(E, 2.0 * x);
return ex / (exi * exi);
}
\ No newline at end of file
......@@ -5,45 +5,38 @@
#ifndef INC_4NEURO_NEURONTANH_H
#define INC_4NEURO_NEURONTANH_H
class NeuronTanh {
#include <cmath>
#include "Neuron.h"
#include "../constants.h"
class NeuronTanh:Neuron {
/**
* Constructs the object of the Hyperbolic Tangent >neuron with activation function
* f(x) = (e^(x-a) - e^(a-x))/(e^(x-a) + e^(a-x))
* @param[in] a First coefficient, stored in activation_function_parameters[0]
*/
explicit NeuronTanh(double a = 0.0);
/**
* Evaluates '(e^(x-a) - e^(a-x))/(e^(x-a) + e^(a-x))' and stores the result into the 'state' property
*/
void activate( ) override;
/**
* Calculates the partial derivative of the activation function
* f(x) = (e^(x-a) - e^(a-x))/(e^(x-a) + e^(a-x))
* @param[in] param_idx Index of the parameter to calculate derivative of
* @return Partial derivative of the activation function according to the
* 'param_idx'-th parameter.
*/
double activation_function_get_partial_derivative(int param_idx) override;
/**
* Calculates d/dx of (e^(x-a) - e^(a-x))/(e^(x-a) + e^(a-x))
* @return a * e^(b - x) * [e^(b - x) + 1]^(-a)
*/
double activation_function_get_derivative( ) override;
};
#endif //INC_4NEURO_NEURONTANH_H
/*
!---------------------!------------------------------------------------------------------------
! class tanh_neuron_t !
!---------------------!
!> Hyperbolic tangent neuron class - uses f(x) = (e^x - e^(-x))/(e^x + e^(-x)) as
!! an activation function, 'x' being the neuron potential.
type, extends(neuron_t) :: tanh_neuron_t
contains
!> Activation function - hyperbolic tangent
procedure, private :: activate => hyperbolic_tangent_activate_impl
end type tanh_neuron_t
interface tanh_neuron_t
!> Constructor for an instance of the class tanh_neuron_t
module procedure :: new_tanh_neuron
end interface tanh_neuron_t
!> Arcus tangents neuron class - uses f(x)=tan^(-1)(x) as an
!! activation function, 'x' being the neuron potential
type, extends(neuron_t) :: arctan_neuron_t
contains
!> Activation function - arcus tangens
procedure, private :: activate => arcus_tangens_activate_impl
end type arctan_neuron_t
interface arctan_neuron_t
!> Constructor for an instance of the class arctan_neuron_t
module procedure :: new_arctan_neuron
end interface arctan_neuron_t
contains
*/
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment