Advertisement
matejnevlud

ANO - NEURONKA

Mar 16th, 2021
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. void feedforward( NN * nn )
  2. {
  3.     // i -> 0 - n
  4.     // w -> layer [0, 1] -> neuron [0, 1, 2] -> i-th dimension [0, i]
  5.     double a1 = nn->w[0][0][0];
  6.     double a2 = nn->w[0][0][1];
  7.     double a3 = nn->w[0][0][2];
  8.    
  9.    
  10.     // For nad vrstvami
  11.     for (int k = 1; k < nn->l; k++) {
  12.  
  13.         // For nad neurony ve vrstvě
  14.         for(int i = 0; i < nn->n[k]; i++){
  15.             double s_k_i = 0.0;
  16.            
  17.             for(int j = 0; j < nn->n[k - 1]; j++) {
  18.                 s_k_i += nn->w[k - 1][i][j] * nn->y[k - 1][j];
  19.             }
  20.  
  21.             //double activation = neuron_activation(nn->w[k][i], inputs, nn->n[k]);
  22.             //nn->y[k][i] = transfer(s_k_i);
  23.             //new_inputs[i] = nn->y[k][i];
  24.  
  25.             double y_k_i = 1.0 / (1.0 + exp(-1.0 * LAMBDA * s_k_i));
  26.             nn->y[k][i] = y_k_i;
  27.            
  28.         }
  29.     }
  30. }
  31.  
  32. double backpropagation( NN * nn, double * t ) {
  33.     double error = 0.0;
  34.  
  35.     // Calculate ERROR
  36.     for (int i = 0; i < 2; i++){
  37.         error += powf(t[i] - nn->y[2][i], 2);
  38.     }
  39.     error *= 0.5f;
  40.  
  41.     // Calculate deltas for weight correction
  42.     int output_k = nn->l - 1;
  43.     for (int k = nn->l - 1; k >= 0; k--) {
  44.         for(int i = 0; i < nn->n[k]; i++){
  45.  
  46.             double d_k_i = 0.0;
  47.  
  48.             if(output_k == k) {
  49.                 d_k_i += (t[i] - nn->y[k][i]) * LAMBDA * (1.0f - nn->y[k][i]);
  50.             } else {
  51.                 for(int j = 0; j < nn->n[k + 1]; j++) {
  52.                     d_k_i += nn->d[k + 1][j] * nn->w[k][j][i]; // nn->w[k][i][j]
  53.                 }
  54.                 d_k_i *= LAMBDA * nn->y[k][i] * (1.0f - nn->y[k][i]);
  55.             }
  56.            
  57.             nn->d[k][i] = d_k_i;
  58.         }
  59.     }
  60.  
  61.     // Calculate new weights with computed deltas
  62.     for (int k = 0; k < nn->l - 1; k++) {
  63.         for(int i = 0; i < nn->n[k + 1]; i++) { // Tím indexem [k + 1] si nejsem vůůůbec jistý
  64.             for(int j = 0; j < nn->n[k]; j++) {
  65.                 nn->w[k][i][j] += ETA * nn->d[k + 1][i] * nn->y[k][j];
  66.             }
  67.         }
  68.     }
  69.  
  70.     return error;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement