Guest User

Untitled

a guest
Jan 9th, 2016
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1.  
  2. #ifndef NN_H
  3. #define NN_H
  4. #pragma once
  5.  
  6. #include <cmath>
  7. using namespace std;
  8.  
  9. namespace nn
  10. {
  11. class connection
  12. {
  13. public:
  14. double weight;
  15. double deltaWeight;
  16.  
  17. void deltainit() { deltaWeight = 0.0; }
  18. void init() { weight = rand() / double(RAND_MAX); deltainit(); }
  19.  
  20. connection(double w, double d) { weight = w; deltaWeight = d; }
  21. connection(double w) { weight = w; deltainit(); }
  22. connection() { init(); }
  23. ~connection() { }
  24. };
  25.  
  26. class neuron;
  27. class layer
  28. {
  29. public:
  30. vector<neuron> neuron;
  31.  
  32. layer() { }
  33. ~layer() { }
  34. };
  35.  
  36. class neuron
  37. {
  38. public:
  39. int index;
  40. vector<connection> connections;
  41. double outputvalue;
  42. double eta;
  43. double alpha;
  44. double gradient;
  45.  
  46. void feedForward(layer *prevLayer)
  47. {
  48. double sum = 0.0;
  49. for (int n = 0; n < prevLayer->neuron.size(); ++n) {
  50. sum += prevLayer->neuron[n].outputvalue * prevLayer->neuron[n].connections[index].weight;
  51. }
  52.  
  53. outputvalue = tanh(sum);
  54. }
  55.  
  56. void OutputGradients(double targetVal)
  57. {
  58. double delta = targetVal - outputvalue;
  59. gradient = delta * (1.0 - outputvalue * outputvalue);
  60. }
  61.  
  62. void HiddenGradients(layer *nextlayer)
  63. {
  64. double sum = 0.0;
  65. for (int n = 0; n < nextlayer->neuron.size() - 1; ++n) {
  66. sum += connections[n].weight * nextlayer->neuron[n].gradient;
  67. }
  68.  
  69. gradient = sum * (1.0 - outputvalue * outputvalue);
  70. }
  71.  
  72. void updateInputWeights(layer *in)
  73. {
  74. double olddelta = 0.0;
  75. for (int n = 0; n < in->neuron.size(); ++n) {
  76. olddelta = in->neuron[n].connections[index].deltaWeight;
  77. in->neuron[n].connections[index].deltaWeight = eta * in->neuron[n].outputvalue * gradient + alpha * olddelta;
  78. in->neuron[n].connections[index].weight += in->neuron[n].connections[index].deltaWeight;
  79. }
  80. }
  81.  
  82. void init()
  83. {
  84. outputvalue = 0.0;
  85. eta = 0.15;
  86. alpha = 0.5;
  87. gradient = rand() / double(RAND_MAX);
  88. }
  89.  
  90. neuron( int NeuronIndex, int Connections )
  91. {
  92. for (int a = 0; a < Connections; a++) connections.push_back(connection());
  93. index = NeuronIndex;
  94. init();
  95. }
  96.  
  97. neuron() {
  98. init();
  99. }
  100.  
  101. ~neuron(){
  102. }
  103.  
  104. };
  105.  
  106. class network
  107. {
  108. public:
  109. vector<layer> layers;
  110. double error;
  111. double error_avarage;
  112. double error_smoothing_factor;
  113. void results(vector<double> *in)
  114. {
  115. in->clear();
  116.  
  117. for (int n = 0; n < layers.back().neuron.size() - 1; ++n) {
  118. in->push_back(layers.back().neuron[n].outputvalue);
  119. }
  120. }
  121.  
  122. void learn(vector<double> *in)
  123. {
  124. int n, a;
  125. error = 0.0;
  126. for (unsigned n = 0; n < layers.back().neuron.size() - 1; ++n) {
  127. double delta = (*in)[n] - layers.back().neuron[n].outputvalue;
  128. error += delta * delta;
  129. }
  130. error /= layers.back().neuron.size() - 1;
  131. error = sqrt(error);
  132. error_avarage = (error_avarage * error_smoothing_factor + error) / (error_smoothing_factor + 1.0);
  133.  
  134. for (n = 0; n < layers.back().neuron.size() - 1; ++n) {
  135. layers.back().neuron[n].OutputGradients((*in)[n]);
  136. }
  137.  
  138. for (a = layers.size() - 2; a > 0; --a) {
  139.  
  140. for (n = 0; n < layers[a].neuron.size(); ++n) {
  141. layers[a].neuron[n].HiddenGradients(&layers[a + 1]);
  142. }
  143. }
  144.  
  145. for (a = layers.size() - 1; a > 0; --a) {
  146. for (n = 0; n < layers[a].neuron.size() - 1; n++) {
  147. layers[a].neuron[n].updateInputWeights(&layers[a - 1]);
  148. }
  149. }
  150. }
  151.  
  152. void feed(vector<double> *in)
  153. {
  154. int n;
  155. for (n = 0; n < layers[0].neuron.size(); n++){
  156. layers[0].neuron[n].outputvalue = (*in)[n];
  157. }
  158.  
  159. for (int a = 1; a < layers.size(); a++) {
  160. for (n = 0; n < layers[a].neuron.size(); n++) layers[a].neuron[n].feedForward( &layers[a - 1] );
  161. }
  162. }
  163.  
  164.  
  165. void init(vector<int> *layers_and_neurons)
  166. {
  167. int n;
  168. // error = 0.0;
  169. // error_avarage = 0.0;
  170. error_smoothing_factor = 100.0;
  171.  
  172. for (int a = 0; a < layers_and_neurons->size() - 1; a++)
  173. {
  174. layers.push_back(layer());
  175. for (n = 0; n <= (*layers_and_neurons)[a]; n++) {
  176. layers.back().neuron.push_back(neuron(n, (*layers_and_neurons)[a + 1]));
  177.  
  178. }
  179. layers.back().neuron.back().outputvalue = 1.0;
  180. }
  181.  
  182. layers.push_back(layer());
  183. for (n = 0; n <= layers_and_neurons->back(); n++) {
  184. layers.back().neuron.push_back(neuron(n, 0));
  185.  
  186. }
  187. layers.back().neuron.back().outputvalue = 1.0;
  188. }
  189.  
  190. network()
  191. {
  192. }
  193.  
  194. ~network()
  195. {
  196. }
  197.  
  198. };
  199.  
  200. }
  201.  
  202. #endif
Advertisement
Add Comment
Please, Sign In to add comment