CGC_Codes

NN

Jun 4th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace nNetwork
  9. {
  10.     public class NeuralNetwork
  11.     {
  12.         private int inpCount { get; set; }
  13.  
  14.         private int hiddenCount { get; set; }
  15.         private int outCount { get; set; }
  16.         private int layersCount { get; set; }
  17.  
  18.         public double factor { get; set; }
  19.  
  20.         private NeuralLayer[] layers;
  21.  
  22.         public NeuralNetwork(int layers_count, int input_count, int output_count, int hidden_count)
  23.         {
  24.             layers = new NeuralLayer[layers_count];
  25.  
  26.             layersCount = layers_count;
  27.  
  28.             inpCount = input_count;
  29.             outCount = output_count;
  30.  
  31.             hiddenCount = (layersCount - 2) * hidden_count;
  32.  
  33.             factor = 0.7 * Math.Pow((double)hiddenCount, (1 / (double)inpCount));
  34.  
  35.             layers[0] = new NeuralLayer(input_count, input_count, hidden_count, factor);
  36.             layers[layers.Length - 1] = new NeuralLayer(output_count, hidden_count, output_count, factor);
  37.             layers[layers.Length - 2] = new NeuralLayer(hidden_count, hidden_count, output_count, factor);
  38.  
  39.             if (layers_count > 3)
  40.             {
  41.                 for (int i = 1; i < layers.Length - 2; i++)
  42.                 {
  43.                     layers[i] = new NeuralLayer(hidden_count, layers[i - 1].outCount, hidden_count, factor);
  44.                 }
  45.             }
  46.  
  47.  
  48.             layers[0].isInput = true;
  49.             layers[layers.Length - 1].isOutput = true;
  50.         }
  51.  
  52.         public double Run(double[] data)
  53.         {
  54.             this.Clean();
  55.  
  56.             for (int i = 0; i < layers[0].neurons.Length; i++)
  57.             {
  58.                 layers[0].neurons[i].data = data[i];
  59.             }
  60.  
  61.             for (int i = 1; i < layers.Length; i++)
  62.             {
  63.                 NeuralLayer temp = layers[i];
  64.                 NeuralLayer prev = layers[i - 1];
  65.  
  66.                 for (int j = 0; j < temp.nCount; j++)
  67.                     for (int k = 0; k < prev.nCount; k++)
  68.                     {
  69.                         if (prev.isInput)
  70.                         {
  71.                             temp.neurons[j].input(prev.neurons[k].output(false) * prev.weight[k, j] + prev.bias[k, j]);
  72.                         }
  73.                         else
  74.                         {
  75.                             temp.neurons[j].input(prev.neurons[k].output() * prev.weight[k, j] + prev.bias[k, j]);
  76.                         }
  77.                     }
  78.             }
  79.  
  80.             return layers[layers.Length - 1].neurons[0].output();
  81.         }
  82.  
  83.         public double Err(double[] data, double[] res)
  84.         {
  85.             double summ = 0;
  86.  
  87.             for (int i = 0; i < data.Length; i++)
  88.             {
  89.                 summ += Math.Pow(res[i] - data[i], 2);
  90.             }
  91.  
  92.             return summ / (double)res.Length;
  93.         }
  94.  
  95.  
  96.         /*public double train(double[] data, double []res)
  97.         {
  98.             double result = Run(data);
  99.             double[] delta = new double[res.Length];
  100.             for(int i = 0; i < outCount; i++)
  101.             {
  102.                 delta[i] = res[i] - layers[layersCount - 1].neurons[i].activation_function(layers[layersCount - 1].neurons[i].data);
  103.             }
  104.             for (int i = layers.Length - 1; i > 1; i--)
  105.             {
  106.                 NeuralLayer temp = layers[i];
  107.                 NeuralLayer prev = layers[i - 1];
  108.                 for (int j = 0; j < temp.nCount; j++)
  109.                     for (int k = 0; k < prev.nCount; k++)
  110.                     {
  111.                         double ErrSumm = 0;
  112.                         for (int t = 0; t < temp.neurons.Length; t++)
  113.                         {
  114.                                 ErrSumm +=
  115.                         }
  116.                         for (int n = 0; n < prev.neurons.Length; n++)
  117.                             for (int m = 0; m < temp.neurons.Length; m++)
  118.                             {
  119.                                 double learning_speed = 1;
  120.                                 double data_delta = delta * temp.neurons[m].derivative_af();
  121.                                 double weight_delta = learning_speed * prev.neurons[n].output() * data_delta;
  122.                                 prev.weight[n, m] += weight_delta;
  123.                                 prev.bias[n, m] += weight_delta;
  124.                             }
  125.                     }
  126.             }
  127.             return 0;
  128.         }*/
  129.         public void train(double[] data, double[] res)
  130.         {
  131.             double result = Run(data);
  132.  
  133.             double outDelta = res[0] - result;
  134.  
  135.             layers[layersCount - 1].neurons[0].delta = outDelta * layers[layersCount - 1].neurons[0].derivative_af();
  136.  
  137.             for (int i = layers.Length - 1; i > 0; i--)
  138.             {
  139.                 NeuralLayer temp = layers[i];
  140.                 NeuralLayer prev = layers[i - 1];
  141.  
  142.                 for (int n = 0; n < prev.nCount; n++)
  143.                     for (int m = 0; m < temp.nCount; m++)
  144.                     {
  145.                         double weight_delta = 0;
  146.                         double learning_speed = 4;
  147.                         if (temp.isOutput)
  148.                         {
  149.                             double derrivated_delta = temp.neurons[m].delta;
  150.  
  151.                             weight_delta = learning_speed * prev.neurons[n].output() * derrivated_delta;
  152.  
  153.                             prev.weight[n, m] += weight_delta;
  154.                             prev.bias[n, m] += learning_speed * derrivated_delta;
  155.  
  156.                             prev.neurons[n].delta += prev.neurons[n].output() * derrivated_delta;
  157.                         }
  158.                         else
  159.                         {
  160.                             double summ_derrivated_delta = getNextLayoutErrorSumm(n, prev) * prev.neurons[n].derivative_af();
  161.  
  162.                             if (prev.isInput)
  163.                                 weight_delta = learning_speed * prev.neurons[n].output(false) * summ_derrivated_delta;
  164.                             else
  165.                                 weight_delta = learning_speed * prev.neurons[n].output() * summ_derrivated_delta;
  166.  
  167.                             prev.weight[n, m] += weight_delta;
  168.                             prev.bias[n, m] += learning_speed * summ_derrivated_delta;
  169.  
  170.                             prev.neurons[n].delta += prev.neurons[n].output() * getNextLayoutErrorSumm(n, prev);
  171.                         }
  172.                     }
  173.             }
  174.         }
  175.  
  176.         private double getNextLayoutErrorSumm(int neuronIndex, NeuralLayer layer)
  177.         {
  178.             double result = 0;
  179.             NeuralLayer next = null;
  180.  
  181.             for (int i = 0; i < layers.Length; i++)
  182.             {
  183.                 if (layers[i] == layer)
  184.                 {
  185.                     next = layers[i + 1];
  186.                     break;
  187.                 }
  188.             }
  189.  
  190.             for (int m = 0; m < next.nCount; m++)
  191.             {
  192.                 result += next.neurons[m].delta * layer.weight[neuronIndex, m];
  193.             }
  194.  
  195.             return result;
  196.         }
  197.         public void SafeToFile()
  198.         {
  199.  
  200.         }
  201.  
  202.         public void LoadFromFile()
  203.         {
  204.  
  205.         }
  206.  
  207.         private void Clean()
  208.         {
  209.             foreach (NeuralLayer layer in layers)
  210.                 foreach (Neuron neuron in layer)
  211.                 {
  212.                     neuron.Clean();
  213.                 }
  214.         }
  215.  
  216.         private int getCountOfNeurons()
  217.         {
  218.             return inpCount + hiddenCount + outCount;
  219.         }
  220.  
  221.     }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment