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>
- 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 = 40000000;
- 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.00000000001;
- double xerr[nr_neurons_G], xerrtotal;
- double sqerrtot = 0;
- double ato[5];
- double bto[5];
- double cto[5];
- double dto[5];
- double eto[5];
- double fto[5];
- double atoTOTAL[5];
- double btoTOTAL[5];
- double ctoTOTAL[5];
- double dtoTOTAL[5];
- double etoTOTAL[5];
- double ftoTOTAL[5];
- 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;
- 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++) {
- train_input[i][j] = (i + 1.00) / (j + 1);
- train_output[i][j] = 2.33 * pow(train_input[i][j],1.22);
- }
- }
- 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++) {
- std::fill(atoTOTAL, atoTOTAL+5, 0);
- std::fill(btoTOTAL, btoTOTAL+5, 0);
- std::fill(ctoTOTAL, ctoTOTAL+5, 0);
- std::fill(dtoTOTAL, dtoTOTAL+5, 0);
- std::fill(etoTOTAL, etoTOTAL+5, 0);
- std::fill(ftoTOTAL, ftoTOTAL+5, 0);
- std::fill(ato, ato+5, 0);
- std::fill(bto, bto+5, 0);
- std::fill(cto, cto+5, 0);
- std::fill(dto, dto+5, 0);
- std::fill(eto, eto+5, 0);
- std::fill(fto, fto+5, 0);
- //d::fill(ato, ato+5, 0);
- //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) {
- a[A].o[B] = fx(choose(shuffled, A) * a[A].w[B] /*+ a[A].bw[B] * a[A].b[B]*/ );
- ato[B] += a[A].o[B];
- atoTOTAL[B] += a[A].o[B] ;
- }
- TOTAL += a[A].o[B] * b[B].w[C];
- btoTOTAL[C] += a[A].o[B] * b[B].w[C];
- }
- b[B].o[C] = fx(btoTOTAL[C] /*+ b[B].bw[C] * b[B].b[C]*/ );
- bto[C] += b[B].o[C];
- }
- }
- TOTALdo = 0;
- TOTALco = 0;
- for (E = 0; E < nr_neurons_E; E++) {
- for (D = 0; D < nr_neurons_D; D++) {
- TOTAL = 0;
- for (C = 0; C < nr_neurons_C; C++) {
- if (E == 0) {
- double TOTALcCoD = 0;
- for (B = 0; B < nr_neurons_B; B++) {
- ctoTOTAL[D] += b[B].o[C] * c[C].w[D];
- }
- c[C].o[D] = fx(ctoTOTAL[D] /*+ c[C].bw[D] * c[C].b[D]*/ );
- cto[D] += c[C].o[D];
- }
- TOTAL += c[C].o[D] * d[D].w[E];
- dtoTOTAL[E] += c[C].o[D] * d[D].w[E];
- }
- TOTALdo += (d[D].o[E] = fx(dtoTOTAL[E] /*+ d[D].bw[E] * d[D].b[E]*/ ));
- dto[E] += d[D].o[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];
- etoTOTAL[F] += d[D].o[E] * e[E].w[F];
- }
- TOTALeo += (e[E].o[F] = fx(etoTOTAL[F]/*+ e[E].bw[F] * e[E].b[F]*/ ));
- eto[F] += e[E].o[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];
- ftoTOTAL[G] += e[E].o[F] * f[F].w[G];
- }
- TOTALfo += (f[F].o[G] = fx(ftoTOTAL[G] /*+ f[F].bw[G] * f[F].b[G]*/ ));
- fto[G] += f[F].o[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;
- xDD = learn * xerrtotal;
- gDD_times = xDD;
- avgtot = 0; aw = 0; bw = 0; cw = 0; dw = 0; ew = 0; fw = 0; gw = 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]; }
- for (G = 0; G < nr_neurons_G; G++) {
- zDD_wupd = ftoTOTAL[G] * learn * xerr[G];
- gDD = xDD * g[G].w[0];
- tussen = fd(g[G].o[0]) * zDD_wupd;
- g[G].w[0] -= tussen;
- 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++) {
- gDD_wupd = etoTOTAL[F] * gDD;
- 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;
- 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 (F = 0; F < nr_neurons_F; F++) {
- for (E = 0; E < nr_neurons_E; E++) {
- fDD_wupd = dtoTOTAL[E] * fDD_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 (E = 0; E < nr_neurons_E; E++) {
- for (D = 0; D < nr_neurons_D; D++) {
- eDD_wupd = ctoTOTAL[D] * eDD_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 (D = 0; D < nr_neurons_D; D++) {
- for (C = 0; C < nr_neurons_C; C++) {
- dDD_wupd = btoTOTAL[C] * dDD_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 (C = 0; C < nr_neurons_C; C++) {
- for (B = 0; B < nr_neurons_B; B++) {
- cDD_wupd = ato[B] * cDD_times; //was atotal[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 (B = 0; B < nr_neurons_B; B++) {
- 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);
- avgtot = avgtot / 96;
- aw = aw / (nr_neurons_A*4);
- bw = bw / (nr_neurons_B*4);
- cw = cw / (nr_neurons_C*4);
- dw = dw / (nr_neurons_D*4);
- ew = ew / (nr_neurons_E*4);
- fw = fw / (nr_neurons_F*4);
- gw = gw / (nr_neurons_G);
- row_0 = row_0 / 25;
- row_1 = row_1 / 25;
- row_2 = row_2 / 25;
- row_3 = row_3 / 25;
- 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;
- }
- }
- /*
- for (G = 0; G < nr_neurons_G; G++) {
- zDD_wupd = TOTALfo * learn * xerr[G];
- gDD = xDD * g[G].w[0];
- gDD_wupd = TOTALeo * gDD;
- g[G].w[0] -= fd(g[G].o[0]) * zDD_wupd * nr_neurons_G;
- for (F = 0; F < nr_neurons_F; F++) {
- fDD = f[F].w[G] * gDD;
- fDD_wupd = TOTALdo * fDD;
- f[F].w[G] -= fd(f[F].o[G]) * gDD_wupd * nr_neurons_F / xerrtotal * xerr[G];
- }
- }
- for (F = 0; F < nr_neurons_F; F++) {
- for (E = 0; E < nr_neurons_E; E++) {
- eDD = e[E].w[F] * fDD;
- eDD_wupd = TOTALco * eDD;
- e[E].w[F] -= fd(e[E].o[F]) * fDD_wupd * nr_neurons_E;
- }
- }
- for (E = 0; E < nr_neurons_E; E++) {
- for (D = 0; D < nr_neurons_D; D++) {
- dDD = d[D].w[E] * eDD;
- dDD_wupd = TOTALbo * dDD;
- d[D].w[E] -= fd(d[D].o[E]) * eDD_wupd * nr_neurons_D;
- }
- }
- for (D = 0; D < nr_neurons_D; D++) {
- for (C = 0; C < nr_neurons_C; C++) {
- cDD = c[C].w[D] * dDD;
- cDD_wupd = cDD * TOTALao;
- c[C].w[D] -= fd(c[C].o[D]) * dDD_wupd * nr_neurons_C;
- }
- }
- for (C = 0; C < nr_neurons_C; C++) {
- for (B = 0; B < nr_neurons_B; B++) {
- bDD = b[B].w[C] * cDD;
- b[B].w[C] -= fd(b[B].o[C]) * cDD_wupd * nr_neurons_B;
- }
- }
- for (B = 0; B < nr_neurons_B; B++) {
- for (A = 0; A < nr_neurons_A; A++) {
- a[A].w[B] -= train_input[shuffled][A] * fd(a[A].o[B]) * bDD * nr_neurons_A;
- }
- }
- */
- }
- }
- 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