Advertisement
Guest User

Untitled

a guest
May 28th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <string>
  4. #include <sstream>
  5. #include <stack>
  6. #include <queue>
  7. #include <iostream>
  8. #include <fstream>
  9. #include <ctime>
  10. #include <iomanip>
  11. #include <Windows.h>
  12. #include <cmath>
  13. #define E 2.71828182845904523536
  14.  
  15. using namespace std;
  16.  
  17.  
  18. int liczbaIteracji = 1500;
  19. const int liczbaNeuronow = 20;
  20. const int liczbaWejsc = 5;
  21. const int liczbaWzorcow = 10;
  22. double wspolczynnikUczeniaWarstwyWejsciowej = 0.0001;
  23. double wspolczynnikUczeniaWarstwyUkrytej = 0.01;
  24. double blad = 0.0;
  25. double bladSieci = 0.0;
  26. int numerWzorca = 0;
  27. double wagiWarstwyUkrytej[liczbaNeuronow];
  28. float wagiWarstwyWejsciowej[liczbaWejsc][liczbaNeuronow];
  29. float wartosciWarstwyUkrytej[liczbaNeuronow];
  30. double wynikSieci;
  31. int wzorceWejsciowe[liczbaWzorcow];
  32. double wzorceWyjsciowe[liczbaWzorcow];
  33.  
  34. void losowanko();
  35. void uczSiec(int &numerWzorca, double &bladSieci);
  36. void wyswietlWyniki(int &numerWzorca);
  37. void oblicz();
  38. double obliczWyjscie(double lacznePobudzenieNeuronu);
  39. void korygujWagiWarstwyUkrytej();
  40. void korygujWagiWarstwyWejsciowej();
  41. double obliczPochodna(double wartoscWarstwyUkrytej);
  42. void obliczBladSieci(double &bladsieci);
  43.  
  44. int main() {
  45.  
  46. srand(time(0));
  47. losowanko();
  48. uczSiec(numerWzorca, bladSieci);
  49. wyswietlWyniki(numerWzorca);
  50. system("pause");
  51. }
  52.  
  53. void losowanko() {
  54.  
  55. for (int i = 0; i < liczbaNeuronow; i++)
  56. {
  57. float losowa = (-100+(rand()%300));
  58. wagiWarstwyUkrytej[i] = losowa/1000 ;
  59.  
  60. for (int j = 0; j < liczbaNeuronow; j++)
  61. {
  62. losowa = (-125 + (rand() % 500)) ;
  63.  
  64. wagiWarstwyWejsciowej[j][i] = losowa/1000;
  65.  
  66. }
  67. }
  68.  
  69. for (int i = 0; i < liczbaWzorcow; i++)
  70. {
  71. wzorceWejsciowe[i] = 1+(rand()%100);
  72. wzorceWyjsciowe[i] = sqrt(wzorceWejsciowe[i]);
  73. }
  74. }
  75.  
  76. void uczSiec(int &numerWzorca, double &bladSieci) {
  77.  
  78. ofstream bledy;
  79. bledy.open("bledy.txt", ios::out);
  80.  
  81. for (int i = 0; i < liczbaIteracji; i++) {
  82. for (int j = 0; j < liczbaWzorcow; j++) {
  83. numerWzorca = j;
  84. oblicz();
  85. korygujWagiWarstwyUkrytej();
  86. korygujWagiWarstwyWejsciowej();
  87. }
  88. obliczBladSieci(bladSieci);
  89. bledy << "Blad przy " << i << " iteracji wynosi: " << bladSieci <<endl;
  90. }
  91. bledy.close();
  92.  
  93. }
  94.  
  95. void wyswietlWyniki(int &numerWzorca) {
  96. for (int i = 0; i < liczbaWzorcow; i++)
  97. {
  98. numerWzorca = i;
  99. oblicz();
  100. double roznica = wzorceWyjsciowe[numerWzorca] - wynikSieci;
  101. cout << fixed;
  102. cout << "Wejscie " << i << " wynosi: " << setprecision(10) << roznica << endl;
  103.  
  104. }
  105. }
  106.  
  107. void oblicz() {
  108.  
  109. for (int i = 0; i < liczbaNeuronow; i++) {
  110. wartosciWarstwyUkrytej[i] = 0.0;
  111. for (int j = 0; j < liczbaWejsc; j++) {
  112. wartosciWarstwyUkrytej[i] += wagiWarstwyWejsciowej[j][i] * wzorceWejsciowe[numerWzorca];
  113. }
  114. wartosciWarstwyUkrytej[i] = obliczWyjscie(wartosciWarstwyUkrytej[i]);
  115. }
  116.  
  117. wynikSieci = 0.0;
  118.  
  119. for (int i = 0; i < liczbaNeuronow; i++) {
  120. wynikSieci += wagiWarstwyUkrytej[i] * wartosciWarstwyUkrytej[i];
  121. }
  122. blad = wynikSieci - wzorceWyjsciowe[numerWzorca];
  123. }
  124.  
  125. double obliczWyjscie(double lacznePobudzenieNeuronu) {
  126. return (1 / (pow(E, lacznePobudzenieNeuronu)));
  127. }
  128.  
  129. void korygujWagiWarstwyUkrytej() {
  130. for (int i = 0; i < liczbaNeuronow; i++) {
  131. wagiWarstwyUkrytej[i] = wagiWarstwyUkrytej[i] - blad*wartosciWarstwyUkrytej[i] * wspolczynnikUczeniaWarstwyUkrytej;
  132. }
  133. }
  134.  
  135. void korygujWagiWarstwyWejsciowej()
  136. {
  137. for (int i = 0; i<liczbaNeuronow; i++) {
  138. for (int j = 0; j<liczbaWejsc; j++) {
  139. wagiWarstwyWejsciowej[j][i] = wagiWarstwyWejsciowej[j][i] - blad*obliczPochodna(wartosciWarstwyUkrytej[i])*wagiWarstwyUkrytej[i] * wspolczynnikUczeniaWarstwyWejsciowej*wzorceWejsciowe[numerWzorca];
  140. }
  141. }
  142. }
  143.  
  144. double obliczPochodna(double wartoscWarstwyUkrytej) {
  145. return (1 - wartoscWarstwyUkrytej)*wartoscWarstwyUkrytej;
  146. }
  147.  
  148. void obliczBladSieci(double &bladsieci) {
  149. bladSieci = 0.0;
  150. for (int i = 0; i<liczbaWzorcow; i++) {
  151. numerWzorca = i;
  152. oblicz();
  153. bladSieci = bladSieci + blad*blad;
  154. }
  155. bladSieci = sqrt(bladSieci / liczbaWzorcow);
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement