00001
00020 #ifndef AURESERVOIR_ACTIVATIONS_H__
00021 #define AURESERVOIR_ACTIVATIONS_H__
00022
00023 #include "utilities.h"
00024 #include <math.h>
00025
00026 namespace aureservoir
00027 {
00028
00033 enum ActivationFunction
00034 {
00035 ACT_LINEAR,
00036 ACT_TANH,
00037 ACT_TANH2,
00038 ACT_SIGMOID
00039 };
00040
00043
00045
00046
00052 template <typename T>
00053 inline void act_linear(T *data, int size)
00054 { }
00055
00061 template <typename T>
00062 inline void act_invlinear(T *data, int size)
00063 { }
00064
00066
00067
00068
00069
00075 template <typename T>
00076 inline void act_tanh(T *data, int size)
00077 {
00078 for(int i=0; i<size; ++i)
00079 data[i] = tanh( data[i] );
00080 }
00081
00087 template <typename T>
00088 inline void act_invtanh(T *data, int size)
00089 {
00090 for(int i=0; i<size; ++i)
00091 data[i] = atanh( data[i] );
00092 }
00093
00095
00096
00097
00099 DEVector<double>::Type tanh2_a_;
00101 DEVector<double>::Type tanh2_b_;
00102
00110 template <typename T>
00111 inline void act_tanh2(T *data, int size)
00112 {
00113 assert( tanh2_a_.length() == size );
00114 assert( tanh2_b_.length() == size );
00115
00116 for(int i=0; i<size; ++i)
00117 data[i] = tanh( data[i]*tanh2_a_(i+1) + tanh2_b_(i+1) );
00118 }
00119
00126 template <typename T>
00127 inline void act_invtanh2(T *data, int size)
00128 {
00129 assert( tanh2_a_.length() == size );
00130 assert( tanh2_b_.length() == size );
00131
00132 for(int i=0; i<size; ++i)
00133 data[i] = ( atanh(data[i]) - tanh2_b_(i+1) ) / tanh2_a_(i+1);
00134 }
00135
00137
00138
00139
00146 template <typename T>
00147 inline void act_sigmoid(T *data, int size)
00148 {
00149 for(int i=0; i<size; ++i)
00150 data[i] = 1.0 / (1.0 + exp(data[i]) );
00151 }
00152
00160 template <typename T>
00161 inline void act_invsigmoid(T *data, int size)
00162 {
00163 for(int i=0; i<size; ++i)
00164 data[i] = log( 1.0/data[i] - 1.0 );
00165 }
00166
00168
00169 }
00170
00171 #endif // AURESERVOIR_ACTIVATIONS_H__