Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <random>
- #include <algorithm>
- #include <iterator>
- #include <iostream>
- #include <windows.h>
- //disable or alter 'block x' if one changes the number of neurons.
- const int nr_neurons_A = 4;
- const int nr_neurons_B = 4;
- const int nr_neurons_C = 4;
- const int nr_neurons_D = 4;
- const int nr_neurons_E = 4;
- const int nr_neurons_F = 4;
- const int nr_neurons_G = 4;
- int tota = nr_neurons_A + nr_neurons_B + nr_neurons_C + nr_neurons_D + nr_neurons_E + nr_neurons_F + nr_neurons_G;
- int Z;
- int A, B, C, D, E, F, G;
- int loops = 12660;
- int showtime = 0.50 * loops;
- int zrows = 99;
- int temp, i1, i2, rows, shuffled;
- int i, j;
- int showoutputs;
- double xDD, gDD, fDD, eDD, dDD, cDD, bDD, zDD;
- double bDD_xupd, bDD_xbupd;
- double cDD_wupd, cDD_bupd;
- double dDD_wupd, dDD_bupd;
- double eDD_wupd, eDD_bupd;
- double fDD_wupd, fDD_bupd;
- double gDD_wupd, gDD_bupd;
- double zDD_wupd, zDD_bupd;
- double membDD_xupd[nr_neurons_A][nr_neurons_B];
- double memBWC_xupd[nr_neurons_B][nr_neurons_C];
- double memCWD_xupd[nr_neurons_C][nr_neurons_D];
- double memDWD_xupd[nr_neurons_D][nr_neurons_E];
- double memEWD_xupd[nr_neurons_E][nr_neurons_F];
- double memFWD_xupd[nr_neurons_F][nr_neurons_G];
- double memGWD_xupd[nr_neurons_G];
- double sqcalc, gemiddelde;
- double TOTAL, TOTALcCoD, TOTALao, TOTALbo, TOTALco, TOTALdo, TOTALeo, TOTALfo;
- double learn = 0.00000001;
- double xerr[nr_neurons_G], xerrtotal;
- double sqerrtot = 0;
- bool training_mode = false;
- double train_input[100][nr_neurons_A];
- double train_output[100][nr_neurons_G];
- double requested1[nr_neurons_A];
- double gDD_times, fDD_times, eDD_times, dDD_times, cDD_times, bDD_times;
- double avgtot, aw, bw, cw, dw, ew, fw, gw;
- double tussen, row_0, row_1, row_2, row_3;
- int tijdelijk;
- struct MiddleNode {
- std::vector < double > w = std::vector < double > (256, 0.00);
- std::vector < double > o = std::vector < double > (256, 0.00);
- std::vector < double > bw = std::vector < double > (256, 0.00);
- std::vector < double > b = std::vector < double > (256, 0.00);
- };
- struct InputNode {
- std::vector < double > w = std::vector < double > (256, 0.00);
- std::vector < double > o = std::vector < double > (256, 0.00);
- std::vector < double > bw = std::vector < double > (256, 0.00);
- std::vector < double > b = std::vector < double > (256, 0.00);
- };
- struct OutputNode {
- std::vector < double > w = std::vector < double > (256, 0.00);
- std::vector < double > o = std::vector < double > (256, 0.00);
- std::vector < double > bw = std::vector < double > (256, 0.00);
- std::vector < double > b = std::vector < double > (256, 0.00);
- };
- double choose(int x, int aa) {
- if (training_mode) return train_input[x][aa];
- else return requested1[aa];
- }
- double initialize() {
- return ((rand() % 10000) / 10000.00);
- }
- double fd(double x) {
- return (x >= 0) ? (1) : (0);
- }
- double fx(double x) {
- return (x >= 0) ? (x) : (0);
- }
- int _tmain(int argc, _TCHAR * argv[]) {
- srand(time(NULL));
- std::random_device rd;
- std::mt19937 gh(rd());
- learn = learn / tota;
- InputNode a[nr_neurons_A];
- MiddleNode b[nr_neurons_B];
- MiddleNode c[nr_neurons_C];
- MiddleNode d[nr_neurons_D];
- MiddleNode e[nr_neurons_E];
- MiddleNode f[nr_neurons_F];
- OutputNode g[nr_neurons_G];
- for (i = 0; i < zrows; i++) {
- for (j = 0; j < nr_neurons_A; j++) {
- //results will still fail at extreme low range or extreme high range of this set, afaik this is normal.
- train_input[i][j] = (i + 29.00) / (j + 1);
- train_output[i][j] = 2.33 * pow(train_input[i][j], 2);//predict the outcome of this known calculation, as test. (verifiable)
- }
- }
- for (j = 0; j < nr_neurons_A; j++) {
- requested1[j] = 1.50 / (j + 1.00);
- }
- double input = 0;
- int i1, i2;
- for (i1 = 0; i1 < nr_neurons_A; i1++)
- for (i2 = 0; i2 < nr_neurons_B; i2++) {
- a[i1].w[i2] = initialize();
- a[i1].bw[i2] = initialize();
- a[i1].b[i2] = initialize();
- }
- for (i1 = 0; i1 < nr_neurons_B; i1++)
- for (i2 = 0; i2 < nr_neurons_C; i2++) {
- b[i1].w[i2] = initialize();
- b[i1].bw[i2] = initialize();
- b[i1].b[i2] = initialize();
- }
- for (i1 = 0; i1 < nr_neurons_C; i1++)
- for (i2 = 0; i2 < nr_neurons_D; i2++) {
- c[i1].w[i2] = initialize();
- c[i1].bw[i2] = initialize();
- c[i1].b[i2] = initialize();
- }
- for (i1 = 0; i1 < nr_neurons_D; i1++)
- for (i2 = 0; i2 < nr_neurons_E; i2++) {
- d[i1].w[i2] = initialize();
- d[i1].bw[i2] = initialize();
- d[i1].b[i2] = initialize();
- }
- for (i1 = 0; i1 < nr_neurons_E; i1++)
- for (i2 = 0; i2 < nr_neurons_F; i2++) {
- e[i1].w[i2] = initialize();
- e[i1].bw[i2] = initialize();
- e[i1].b[i2] = initialize();
- }
- for (i1 = 0; i1 < nr_neurons_F; i1++)
- for (i2 = 0; i2 < nr_neurons_G; i2++) {
- f[i1].w[i2] = initialize();
- f[i1].bw[i2] = initialize();
- f[i1].b[i2] = initialize();
- }
- for (i1 = 0; i1 < nr_neurons_G; i1++) {
- g[i1].w[0] = initialize();
- g[i1].bw[0] = initialize();
- g[i1].b[0] = initialize();
- }
- sqcalc = 99999999.99;
- for (temp = 0; temp < loops; temp++) {
- for (rows = 0; rows < zrows+1; rows++) {
- //rows = rand() % (zrows + 1); {
- shuffled = rows;
- if (shuffled == zrows) training_mode = false;
- else training_mode = true;;
- TOTALbo = 0;
- TOTALao = 0;
- for (C = 0; C < nr_neurons_C; C++) {
- for (B = 0; B < nr_neurons_B; B++) {
- TOTAL = 0;
- for (A = 0; A < nr_neurons_A; A++) {
- if (C == 0) {
- TOTALao += (a[A].o[B] = fx(choose(shuffled, A) * a[A].w[B] /*+ a[A].bw[B] * a[A].b[B]*/ ));
- }
- TOTAL += a[A].o[B] * b[B].w[C];
- }
- TOTALbo += (b[B].o[C] = fx(TOTAL /*+ b[B].bw[C] * b[B].b[C]*/ ));
- }
- }
- TOTALdo = 0;
- TOTALco = 0;
- for (E = 0; E < nr_neurons_E; E++) {
- for (D = 0; D < nr_neurons_D; D++) {
- TOTAL = 0;
- TOTALcCoD = 0;
- for (C = 0; C < nr_neurons_C; C++) {
- if (E == 0) {
- //double TOTALcCoD = 0;
- for (B = 0; B < nr_neurons_B; B++) {
- TOTALcCoD += b[B].o[C] * c[C].w[D];
- }
- TOTALco += (c[C].o[D] = fx(TOTALcCoD /*+ c[C].bw[D] * c[C].b[D]*/ ));
- }
- TOTAL += c[C].o[D] * d[D].w[E];
- }
- TOTALdo += (d[D].o[E] = fx(TOTAL /*+ d[D].bw[E] * d[D].b[E]*/ ));
- }
- }
- TOTALeo = 0;
- for (F = 0; F < nr_neurons_F; F++) {
- for (E = 0; E < nr_neurons_E; E++) {
- TOTAL = 0;
- for (D = 0; D < nr_neurons_D; D++) {
- TOTAL += d[D].o[E] * e[E].w[F];
- }
- TOTALeo += (e[E].o[F] = fx(TOTAL /*+ e[E].bw[F] * e[E].b[F]*/ ));
- }
- }
- TOTALfo = 0;
- for (G = 0; G < nr_neurons_G; G++) {
- for (F = 0; F < nr_neurons_F; F++) {
- TOTAL = 0;
- for (E = 0; E < nr_neurons_E; E++) {
- TOTAL += e[E].o[F] * f[F].w[G];
- }
- TOTALfo += (f[F].o[G] = fx(TOTAL /*+ f[F].bw[G] * f[F].b[G]*/ ));
- }
- }
- for (G = 0; G < nr_neurons_G; G++) {
- TOTAL = 0;
- for (F = 0; F < nr_neurons_F; F++) {
- TOTAL += f[F].o[G] * g[G].w[0];
- }
- g[G].o[0] = fx(TOTAL /*+ g[G].bw[0] * g[G].b[0]*/ );
- }
- if (temp > showtime) {
- if (training_mode) {
- printf("\n-");
- for (showoutputs = 0; showoutputs < nr_neurons_G; showoutputs++) {
- printf("\n input: %.2lf The current output_%d for training set[%d] is %.28lf of (%lf)", train_input[shuffled][showoutputs], showoutputs, shuffled, g[showoutputs].o[0], train_output[shuffled][showoutputs]);
- }
- } else {
- for (showoutputs = 0; showoutputs < nr_neurons_G; showoutputs++) {
- printf("\n(loop: % d) output_%d for requested data (%.28lf) is currently : %.8lf (should be:%lf)", temp, showoutputs, requested1[showoutputs], g[showoutputs].o[0], 2.00 * pow(requested1[showoutputs], 2));
- }
- }
- }
- xerrtotal = 0;
- if (training_mode) {
- for (showoutputs = 0; showoutputs < nr_neurons_G; showoutputs++) {
- xerr[showoutputs] = 2 * (g[showoutputs].o[0] - train_output[shuffled][showoutputs]);
- xerrtotal += (xerr[showoutputs]);
- }
- sqerrtot = xerrtotal;
- tijdelijk = 0.00;
- xDD = learn;//*xerrtotal;
- gDD_times = xDD;
- avgtot = 0;
- aw = 0;
- bw = 0;
- cw = 0;
- dw = 0;
- ew = 0;
- fw = 0;
- gw = 0;
- row_0=0; row_1=0; row_2=0; row_3=0;
- for (G = 0; G < nr_neurons_G; G++) gDD_times *= g[G].w[0];
- fDD_times = gDD_times;
- for (G = 0; G < nr_neurons_G; G++) {
- for (F = 0; F < nr_neurons_F; F++) fDD_times *= f[F].w[G];
- }
- eDD_times = fDD_times;
- for (F = 0; F < nr_neurons_F; F++) {
- for (E = 0; E < nr_neurons_E; E++) eDD_times *= e[E].w[F];
- }
- dDD_times = eDD_times;
- for (E = 0; E < nr_neurons_E; E++) {
- for (D = 0; D < nr_neurons_D; D++) dDD_times *= d[D].w[E];
- }
- cDD_times = dDD_times;
- for (D = 0; D < nr_neurons_D; D++) {
- for (C = 0; C < nr_neurons_C; C++) cDD_times *= c[C].w[D];
- }
- bDD_times = cDD_times;
- for (C = 0; C < nr_neurons_C; C++) {
- for (B = 0; B < nr_neurons_B; B++) bDD_times *= b[B].w[C];
- }
- //slower but more precise
- for (G = 0; G < nr_neurons_G; G++) {
- zDD_wupd = TOTALfo * learn * xerr[G];
- gDD = learn * xerr[G] * g[G].w[0];
- gDD_wupd = TOTALeo * gDD;
- tussen = fd(g[G].o[0]) * zDD_wupd;
- g[G].w[0] -= tussen;
- //g[G].w[0] -= new_avgtot;
- //g[G].w[0] -= new_gw;
- gw += tussen;
- avgtot += tussen;
- if (G == 0) row_0 += tussen;
- if (G == 1) row_1 += tussen;
- if (G == 2) row_2 += tussen;
- if (G == 3) row_3 += tussen;
- for (F = 0; F < nr_neurons_F; F++) {
- fDD_wupd = TOTALdo * fDD_times;
- tussen = fd(f[F].o[G]) * gDD_wupd;
- f[F].w[G] -= tussen;
- //f[F].w[G] -= new_avgtot;
- //f[F].w[G] -= new_fw;
- fw += tussen; tijdelijk++;
- avgtot += tussen;
- if (F == 0) row_0 += tussen;
- if (F == 1) row_1 += tussen;
- if (F == 2) row_2 += tussen;
- if (F == 3) row_3 += tussen;
- for (E = 0; E < nr_neurons_E; E++) {
- eDD_wupd = TOTALco * eDD_times;
- tussen = fd(e[E].o[F]) * fDD_wupd;
- e[E].w[F] -= tussen;
- //e[E].w[F] -= new_avgtot;
- //e[E].w[F] -= new_ew;
- ew += tussen;
- avgtot += tussen;
- if (E == 0) row_0 += tussen;
- if (E == 1) row_1 += tussen;
- if (E == 2) row_2 += tussen;
- if (E == 3) row_3 += tussen;
- for (D = 0; D < nr_neurons_D; D++) {
- dDD_wupd = TOTALbo * dDD_times;
- tussen = fd(d[D].o[E]) * eDD_wupd;
- d[D].w[E] -= tussen;
- //d[D].w[E] -= new_avgtot;
- //d[D].w[E] -= new_dw;
- dw += tussen;
- avgtot += tussen;
- if (D == 0) row_0 += tussen;
- if (D == 1) row_1 += tussen;
- if (D == 2) row_2 += tussen;
- if (D == 3) row_3 += tussen;
- for (C = 0; C < nr_neurons_C; C++) {
- cDD_wupd = TOTALao * cDD_times;
- tussen = fd(c[C].o[D]) * dDD_wupd;
- c[C].w[D] -= tussen;
- //c[C].w[D] -= new_avgtot;
- //c[C].w[D] -= new_cw;
- cw += tussen;
- avgtot += tussen;
- if (C == 0) row_0 += tussen;
- if (C == 1) row_1 += tussen;
- if (C == 2) row_2 += tussen;
- if (C == 3) row_3 += tussen;
- for (B = 0; B < nr_neurons_B; B++) {
- tussen = fd(b[B].o[C]) * cDD_wupd;
- b[B].w[C] -= tussen;
- //b[B].w[C] -= new_avgtot;
- //b[B].w[C] -= new_bw;
- bw += tussen;
- avgtot += tussen;
- if (B == 0) row_0 += tussen;
- if (B == 1) row_1 += tussen;
- if (B == 2) row_2 += tussen;
- if (B == 3) row_3 += tussen;
- for (A = 0; A < nr_neurons_A; A++) {
- tussen = train_input[shuffled][A] * fd(a[A].o[B]) * bDD_times;
- a[A].w[B] -= tussen;
- //a[A].w[B] -= new_avgtot;
- //a[A].w[B] -= new_aw;
- aw += tussen;
- avgtot += tussen;
- if (A == 0) row_0 += tussen;
- if (A == 1) row_1 += tussen;
- if (A == 2) row_2 += tussen;
- if (A == 3) row_3 += tussen;
- }
- }
- }
- }
- }
- }
- }
- //printf("\ntijdelijk %d",tijdelijk);
- //BLOCK X BEGIN
- //new_avgtot = avgtot / 21844;
- avgtot = avgtot / 21844;
- aw = aw / 16384;
- bw = bw / 4096;
- cw = cw / 1024;
- dw = dw / 256;
- ew = ew / 64;
- fw = fw / 16;
- gw = gw / 4;
- row_0 = row_0 / 21844;
- row_1 = row_1 / 21844;
- row_2 = row_2 / 21844;
- row_3 = row_3 / 21844;
- for (G = 0; G < nr_neurons_G; G++) {
- g[G].w[0] -= avgtot; //average change for all nodes
- g[G].w[0] -= gw; //average change for this 'block'
- if (G == 0) g[G].w[0] -= row_0;
- if (G == 1) g[G].w[0] -= row_1;
- if (G == 2) g[G].w[0] -= row_2;
- if (G == 3) g[G].w[0] -= row_3;
- for (F = 0; F < nr_neurons_F; F++) {
- f[F].w[G] -= avgtot;
- f[F].w[G] -= fw;
- if (F == 0) f[F].w[G] -= row_0;
- if (F == 1) f[F].w[G] -= row_1;
- if (F == 2) f[F].w[G] -= row_2;
- if (F == 3) f[F].w[G] -= row_3;
- }
- }
- for (F = 0; F < nr_neurons_F; F++) {
- for (E = 0; E < nr_neurons_E; E++) {
- e[E].w[F] -= avgtot;
- e[E].w[F] -= ew;
- if (E == 0) e[E].w[F] -= row_0;
- if (E == 1) e[E].w[F] -= row_1;
- if (E == 2) e[E].w[F] -= row_2;
- if (E == 3) e[E].w[F] -= row_3;
- }
- }
- for (E = 0; E < nr_neurons_E; E++) {
- for (D = 0; D < nr_neurons_D; D++) {
- d[D].w[E] -= avgtot;
- d[D].w[E] -= dw;
- if (D == 0) d[D].w[E] -= row_0;
- if (D == 1) d[D].w[E] -= row_1;
- if (D == 2) d[D].w[E] -= row_2;
- if (D == 3) d[D].w[E] -= row_3;
- }
- }
- for (D = 0; D < nr_neurons_D; D++) {
- for (C = 0; C < nr_neurons_C; C++) {
- c[C].w[D] -= avgtot;
- c[C].w[D] -= cw;
- if (C == 0) c[C].w[D] -= row_0;
- if (C == 1) c[C].w[D] -= row_1;
- if (C == 2) c[C].w[D] -= row_2;
- if (C == 3) c[C].w[D] -= row_3;
- }
- }
- for (C = 0; C < nr_neurons_C; C++) {
- for (B = 0; B < nr_neurons_B; B++) {
- b[B].w[C] -= avgtot;
- b[B].w[C] -= bw;
- if (B == 0) b[B].w[C] -= row_0;
- if (B == 1) b[B].w[C] -= row_1;
- if (B == 2) b[B].w[C] -= row_2;
- if (B == 3) b[B].w[C] -= row_3;
- }
- }
- for (B = 0; B < nr_neurons_B; B++) {
- for (A = 0; A < nr_neurons_A; A++) {
- a[A].w[B] -= avgtot;
- a[A].w[B] -= aw;
- if (A == 0) a[A].w[B] -= row_0;
- if (A == 1) a[A].w[B] -= row_1;
- if (A == 2) a[A].w[B] -= row_2;
- if (A == 3) a[A].w[B] -= row_3;
- }
- }
- //BLOCK X END
- }
- }
- if (!(temp % (showtime / 100))) printf("\n %d %%", ++Z);
- sqcalc += sqerrtot;
- if (temp % 1000 == 0) {
- gemiddelde = sqcalc / 1000;
- sqcalc = 0;
- }
- sqerrtot = 0;
- }
- printf("\nEnd.");
- scanf("%d", & Z);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment