Advertisement
999ms

Untitled

Mar 17th, 2020
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <iomanip>
  5. #include <algorithm>
  6. #include <random>
  7. #include <memory.h>
  8.  
  9. using namespace std;
  10. using ld = long long;
  11. using ll = long long;
  12.  
  13. double f(double x) {
  14.     return 1 / (1 + exp(-x));
  15. }
  16.  
  17. double df_dx(double x) {
  18.     return (1 - x) * x;
  19. }
  20.  
  21. const int LAYERS = 3;
  22. const int NEURONS_IN_LAYER = 2;
  23.  
  24. double in[LAYERS][NEURONS_IN_LAYER];
  25. double out[LAYERS][NEURONS_IN_LAYER];
  26. double deltas[LAYERS][NEURONS_IN_LAYER];
  27. double gradient[LAYERS][NEURONS_IN_LAYER][NEURONS_IN_LAYER]; // [layer][from][to];
  28. double w[LAYERS][NEURONS_IN_LAYER][NEURONS_IN_LAYER]; // [layer][from][to];
  29.  
  30. int main() {
  31.     vector<int> neuronsInLayers = {2, 2, 1};
  32.     for(int i = 0; i < LAYERS - 1; i++) {
  33.         int numberOfNeuronsInCurrentLayer = neuronsInLayers[i];
  34.         int numberOfNeuronInNextLayer = neuronsInLayers[i + 1];
  35.         for(int from = 0; from < numberOfNeuronsInCurrentLayer; from++) {
  36.             for(int to = 0; to < numberOfNeuronInNextLayer; to++) {
  37.                 w[i][from][to] = 1.0 * rand() / RAND_MAX;
  38.             }
  39.         }
  40.     }
  41.  
  42.     const vector<pair<vector<double>, double>> data = {
  43.         {{0, 0}, 0},
  44.         {{0, 1}, 1},
  45.         {{1, 0}, 1},
  46.         {{1, 1}, 0}
  47.     };
  48.  
  49.     const double learningRate = 0.001;
  50.  
  51.  
  52.     for(int epoch = 0; epoch < 200; epoch++) {
  53.         memset(in, 0, sizeof in);
  54.         memset(out, 0, sizeof out);
  55.         memset(gradient, 0, sizeof gradient);
  56.         memset(deltas, 0, sizeof deltas);
  57.  
  58.         for(const auto&[input, output] : data) {
  59.             for(int i = 0; i < size(input); i++) {
  60.                 in[0][i] = out[0][i] = input[i];
  61.             }
  62.  
  63.             for(int layer = 1; layer < LAYERS; layer++) {
  64.                 for(int i = 0; i < neuronsInLayers[layer]; i++) {
  65.                     for(int j = 0; j < neuronsInLayers[layer - 1]; j++) {
  66.                         in[layer][i] += w[layer - 1][j][i] * out[layer - 1][j];
  67.                     }
  68.                     out[layer][i] = f(in[layer][i]);
  69.                 }
  70.             }
  71.  
  72.             deltas[LAYERS - 1][0] = (out[LAYERS - 1][0] - output) * df_dx(in[LAYERS - 1][0]);
  73.  
  74.             for(int layer = LAYERS - 2; layer >= 0; layer--) {
  75.                 for(int j = 0; j < neuronsInLayers[layer]; j++) {
  76.                     double sum = 0;
  77.                     for(int i = 0; i < neuronsInLayers[layer + 1]; i++) {
  78.                         sum += w[layer][j][i] * deltas[layer + 1][i];
  79.                     }
  80.                     deltas[layer][j] = sum * df_dx(in[layer][j]);
  81.                 }
  82.             }
  83.             for(int layer = 0; layer < LAYERS - 1; layer++) {
  84.                 for(int j = 0; j < neuronsInLayers[layer]; j++) {
  85.                     for(int i = 0; i < neuronsInLayers[layer + 1]; i++) {
  86.                         gradient[layer][j][i] += deltas[layer + 1][i] * out[layer][j] / size(data);
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.         for(int layer = 0; layer < LAYERS - 1; layer++) {
  92.             for(int j = 0; j < neuronsInLayers[layer]; j++) {
  93.                 for(int i = 0; i < neuronsInLayers[layer + 1]; i++) {
  94.                     w[layer][j][i] += gradient[layer][j][i] * learningRate;
  95.                 }
  96.             }
  97.         }
  98.     }
  99.  
  100.     auto get = [&](vector<double> input) {
  101.         memset(in, 0, sizeof in);
  102.         memset(out, 0, sizeof out);
  103.         memset(gradient, 0, sizeof gradient);
  104.         memset(deltas, 0, sizeof deltas);
  105.         for(int i = 0; i < size(input); i++) {
  106.             in[0][i] = out[0][i] = input[i];
  107.         }
  108.         for(int layer = 1; layer < LAYERS; layer++) {
  109.             for(int i = 0; i < neuronsInLayers[layer]; i++) {
  110.                 for(int j = 0; j < neuronsInLayers[layer - 1]; j++) {
  111.                     in[layer][i] += w[layer - 1][j][i] * out[layer - 1][j];
  112.                 }
  113.                 out[layer][i] = f(in[layer][i]);
  114.             }
  115.         }
  116.         return out[LAYERS - 1][0];
  117.     };
  118.     for (int i = 0; i < 2; i++) {
  119.         for (int j = 0; j < 2; j++) {
  120.             vector<double> v = {i * 1.0, j * 1.0};
  121.             cout << fixed << setprecision(5) << i << " ^ " << j << " = " << get(v) << endl;
  122.         }
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement