activation.hpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #ifndef LAYER_ACTIVATION_HPP
  2. #define LAYER_ACTIVATION_HPP
  3. #include "layer.hpp"
  4. #include "math.hpp"
  5. namespace Layer{
  6. enum ActivationMap{Sigmoid};
  7. template<ActivationMap A> Real activation_map(Real);
  8. template<ActivationMap A> Real activation_diff_map(Real);
  9. template<> Real activation_map<Sigmoid>(Real);
  10. template<> Real activation_diff_map<Sigmoid>(Real);
  11. template<ActivationMap A> class Activation:public Layer{
  12. private:
  13. using Layer::x_out;
  14. public:
  15. Activation(size_t n);
  16. Vector feed_forward(Vector x);
  17. void init_nabla(){};
  18. Vector back_propagation(Vector d);
  19. void update(Real){};
  20. };
  21. template<ActivationMap A>
  22. inline
  23. Activation<A>::Activation(size_t n):Layer(n,n){
  24. }
  25. template<ActivationMap A>
  26. inline Vector
  27. Activation<A>::feed_forward(Vector x){
  28. x_in=x;
  29. for(size_t i=0;i<n_in;++i){
  30. x_out[i]=activation_map<A>(x[i]);
  31. }
  32. return x_out;
  33. }
  34. template<ActivationMap A>
  35. inline Vector
  36. Activation<A>::back_propagation(Vector d){
  37. for(size_t i=0;i<n_in;++i){
  38. delta[i]=activation_diff_map<A>(x_in[i])*d[i];
  39. }
  40. return delta;
  41. }
  42. template<>
  43. Real
  44. activation_map<Sigmoid>(Real x){
  45. return 1.0/(1.0+exp(-x));
  46. }
  47. template<>
  48. Real
  49. activation_diff_map<Sigmoid>(Real x){
  50. Real t=activation_map<Sigmoid>(x);
  51. return t*(1.0-t);
  52. }
  53. }
  54. #endif