NeuralNetwork.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. 
  2. namespace NeuralNetworkPCL
  3. {
  4. internal class NeuralNetwork
  5. {
  6. Neuron[] hiddenNeurons;
  7. Neuron[] outputNeurons;
  8. int nbInputs;
  9. int nbHidden;
  10. int nbOutputs;
  11. internal NeuralNetwork(int _nbInputs, int _nbHidden, int _nbOutput)
  12. {
  13. nbInputs = _nbInputs;
  14. nbHidden = _nbHidden;
  15. nbOutputs = _nbOutput;
  16. hiddenNeurons = new Neuron[nbHidden];
  17. for (int i = 0; i < nbHidden; i++)
  18. {
  19. hiddenNeurons[i] = new Neuron(_nbInputs);
  20. }
  21. outputNeurons = new Neuron[nbOutputs];
  22. for (int i = 0; i < nbOutputs; i++)
  23. {
  24. outputNeurons[i] = new Neuron(_nbHidden);
  25. }
  26. }
  27. internal double[] Evaluate(DataPoint _point)
  28. {
  29. foreach (Neuron n in hiddenNeurons)
  30. {
  31. n.Clear();
  32. }
  33. foreach (Neuron n in outputNeurons)
  34. {
  35. n.Clear();
  36. }
  37. double[] hiddenOutputs = new double[nbHidden];
  38. for (int i = 0; i < nbHidden; i++)
  39. {
  40. hiddenOutputs[i] = hiddenNeurons[i].Evaluate(_point);
  41. }
  42. double[] outputs = new double[nbOutputs];
  43. for (int outputNb = 0; outputNb < nbOutputs; outputNb++)
  44. {
  45. outputs[outputNb] = outputNeurons[outputNb].Evaluate(hiddenOutputs);
  46. }
  47. return outputs;
  48. }
  49. internal void AdjustWeights(DataPoint _point, double _learningRate)
  50. {
  51. // Deltas pour les sorties
  52. double[] outputDeltas = new double[nbOutputs];
  53. for (int i = 0; i < nbOutputs; i++)
  54. {
  55. double output = outputNeurons[i].Output;
  56. double expectedOutput = _point.Outputs[i];
  57. outputDeltas[i] = output * (1 - output) * (expectedOutput - output);
  58. }
  59. // Deltas pour les neurones cachés
  60. double[] hiddenDeltas = new double[nbHidden];
  61. for (int i = 0; i < nbHidden; i++)
  62. {
  63. double hiddenOutput = hiddenNeurons[i].Output;
  64. double sum = 0.0;
  65. for (int j = 0; j < nbOutputs; j++)
  66. {
  67. sum += outputDeltas[j] * outputNeurons[j].Weight(i);
  68. }
  69. hiddenDeltas[i] = hiddenOutput * (1 - hiddenOutput) * sum;
  70. }
  71. double value;
  72. // Ajustement des poids des neurones de sortie
  73. for (int i = 0; i < nbOutputs; i++)
  74. {
  75. Neuron outputNeuron = outputNeurons[i];
  76. for (int j = 0; j < nbHidden; j++)
  77. {
  78. value = outputNeuron.Weight(j) + _learningRate * outputDeltas[i] * hiddenNeurons[j].Output;
  79. outputNeuron.AdjustWeight(j, value);
  80. }
  81. // Et biais
  82. value = outputNeuron.Weight(nbHidden) + _learningRate * outputDeltas[i] * 1.0;
  83. outputNeuron.AdjustWeight(nbHidden, value);
  84. }
  85. // Ajustement des poids des neurones cachés
  86. for (int i = 0; i < nbHidden; i++)
  87. {
  88. Neuron hiddenNeuron = hiddenNeurons[i];
  89. for (int j = 0; j < nbInputs; j++)
  90. {
  91. value = hiddenNeuron.Weight(j) + _learningRate * hiddenDeltas[i] * _point.Inputs[j];
  92. hiddenNeuron.AdjustWeight(j, value);
  93. }
  94. // Et biais
  95. value = hiddenNeuron.Weight(nbInputs) + _learningRate * hiddenDeltas[i] * 1.0;
  96. hiddenNeuron.AdjustWeight(nbInputs, value);
  97. }
  98. }
  99. }
  100. }