activation.h
#ifndef __SHAREWIZ_ACTIVATION_H__ #define __SHAREWIZ_ACTIVATION_H__ #include <memory> // Built-in activation functions. enum Activation_Types { ACTIVATION_ABS, // Absolute value. ACTIVATION_ARCTAN, // Arctan. ACTIVATION_BENT, // Bent identity. ACTIVATION_BINARY_HALF_STEP, // Binary half step. ACTIVATION_BINARY_STEP, // Binary step. ACTIVATION_BOUNDED_RELU, // Bounded rectified linear. ACTIVATION_ELU, // Exponential Linear Unit. ACTIVATION_GAUSSIAN, // Gaussian. ACTIVATION_IDENTITY, // Linear. ACTIVATION_LINEAR, // Linear. ACTIVATION_LOG, // Logistic. ACTIVATION_PRELU, // Parameteric Rectified Linear Unit. ACTIVATION_RELU, // Rectified linear. ACTIVATION_SCALED_TANH, // Scaled Tanh 1.7159 * tanh(0.66667 * x ). ACTIVATION_SIGMOID, // Sigmoid. ACTIVATION_SINC, // Sinc. ACTIVATION_SINUSOID, // Sinusoid. ACTIVATION_SOFT_EXPONENTIAL, // Soft exponential. ACTIVATION_SOFT_PLUS, // Soft plus. ACTIVATION_SOFT_RELU, // Soft rectified linear. ACTIVATION_SOFT_SIGN, // Soft sign. ACTIVATION_SOFT_STEP, // Soft step (aka Logistic). ACTIVATION_SQRT, // Square Root. ACTIVATION_SQUARE, // Square. ACTIVATION_SQUASH, // Squash. ACTIVATION_STEP, // Step. ACTIVATION_TANH // Hyperbolic tangent. }; class Activation; typedef std::shared_ptr<Activation> pActivationX; //typedef std::vector<pActivationX> pActivation; class Activation { private: //enum {SIGMOID, TANH, RELU, LINEAR} types; //types type; Activation_Types activation_type; public: Activation(); Activation(Activation_Types _activation_type); ~Activation(); double activate(const double& value, const bool derivative = false, const double& alpha=0.0); double abs(const double& value, const bool derivative=false); double arctan(const double& value, const bool derivative=false); double bent(const double& value, const bool derivative = false); double binaryHalfStep(const double& value, const bool derivative = false); double binaryStep(const double& value, const bool derivative = false); double boundedRelu(const double& value, const bool derivative=false); double elu(const double& value, const double& alpha, const bool derivative = false); double gaussian(const double& value, const bool derivative = false); double identity(const double& value, const bool derivative = false); double linear(const double& value, const bool derivative=false); double log(const double& value, const bool derivative=false); double prelu(const double& value, const double& alpha, const bool derivative = false); double relu(const double& value, const bool derivative = false); double scaledTanh(const double& value, const bool derivative = false); double sigmoid(const double& value, const bool derivative=false); double sigmoid_limit(double value, double positive_limit=45.0, double negative_limit=-45.0); double sinc(const double& value, const bool derivative = false); double sinusoid(const double& value, const bool derivative = false); double softExponential(const double& value, const double& alpha, const bool derivative = false); double softPlus(const double& value, const bool derivative = false); double softRelu(const double& value, const bool derivative=false); double softSign(const double& value, const bool derivative = false); double softStep(const double& value, const bool derivative = false); double sqrt(const double& value, const bool derivative = false); double square(const double& value, const bool derivative=false); double squash(const double& value, const bool derivative = false); double step(const double& value, const bool derivative = false); double tanh(const double& value, const bool derivative = false); double tanh_limit(double& value, double positive_limit=10.0, double negative_limit=-10.0); Activation_Types getActivationType(); void setActivationType(Activation_Types _activation_type); //double sigmoid(const double& value); //double sigmoid_derivative(const double& value); //double tanh_derivative(const double& value); }; /* // Built-in activation functions export class Activations { public static TANH: ActivationFunction = { output: x = > (<any>Math).tanh(x), der: x = > { let output = Activations.TANH.output(x); return 1 - output * output; } }; public static RELU: ActivationFunction = { output: x = > Math.max(0, x), der: x = > x <= 0 ? 0 : 1 }; public static SIGMOID: ActivationFunction = { output: x = > 1 / (1 + Math.exp(-x)), der: x = > { let output = Activations.SIGMOID.output(x); return output * (1 - output); } }; public static LINEAR: ActivationFunction = { output: x = > x, der: x = > 1 }; } /* Build-in regularization functions. export class RegularizationFunction { public static L1: RegularizationFunction = { output: w = > Math.abs(w), der: w = > w < 0 ? -1 : 1 }; public static L2: RegularizationFunction = { output: w = > 0.5 * w * w, der: w = > w }; } */ #endif