Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.43 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.  System.Math;
  7.  
  8.  
  9. type
  10.  TNN1DArray =  Array [0 .. 1] of Double;
  11.  T2DTNN1DArray = Array [0 .. 1] of TNN1DArray;
  12.  TNN2DTNN1DArray = Array [0 .. 1] of Array [0 .. 1] of TNN1DArray;
  13.  TNN2DArray =  Array [0 .. 2] of Double;
  14.  TNN2DMemory = Array [0 .. 1] of TNN2DArray;
  15.  
  16.  TNNInputs = packed record
  17.    NNInputs: TNN2DArray;
  18.    State : Double; // Excepted
  19.  end;
  20.  
  21. const
  22.  TrainingData: packed array [0 .. 7] of TNNInputs = (
  23.      (NNInputs : (0, 0, 0); State : 0),
  24.      (NNInputs : (0, 0, 1); State : 1),
  25.      (NNInputs : (0, 1, 0); State : 0),
  26.      (NNInputs : (0, 1, 1); State : 0),
  27.      (NNInputs : (1, 0, 0); State : 1),
  28.      (NNInputs : (1, 0, 1); State : 1),
  29.      (NNInputs : (1, 1, 0); State : 0),
  30.      (NNInputs : (1, 1, 1); State : 1)
  31.      );
  32.  
  33. type
  34.  NNTestClass = class
  35.   private
  36.    weights_0_1: TNN2DMemory;
  37.    weights_1_2: TNN1DArray;
  38.    learning_rate: Double;
  39.  
  40.  
  41.    function RandomRangeF(min, max: Double): Double;
  42.    function Sigmoid(X: Double): Double;
  43.    function Dot(InArray: TNN2DMemory; InputArr: TNN2DArray): TNN1DArray; overload;
  44.    function Dot(A, B: TNN1DArray): Double;  overload;
  45.   public
  46.    procedure init;
  47.    function Predict (InputData: TNNInputs): Double;
  48.    function Train(Inputs: TNN2DArray; Expected_predict: Double): TNN2DMemory;
  49.  end;
  50.  
  51.  var
  52.   NN: NNTestClass;
  53.  
  54. implementation
  55.  
  56. function NNTestClass.Dot(InArray: TNN2DMemory; InputArr: TNN2DArray): TNN1DArray;
  57. begin
  58.  Result[0] :=
  59.   (InArray[0, 0] * InputArr[0]) +
  60.   (InArray[0, 1] * InputArr[1]) +
  61.   (InArray[0, 2] * InputArr[2]);
  62.  
  63.  Result[1] :=
  64.   (InArray[1, 0] * InputArr[0]) +
  65.   (InArray[1, 1] * InputArr[1]) +
  66.   (InArray[1, 2] * InputArr[2]);
  67. end;
  68.  
  69. function NNTestClass.Dot(A, B: TNN1DArray): Double;
  70. begin
  71.  Result := (A[0] * B[0]) + (A[1] * B[1]);
  72. end;
  73.  
  74. function NNTestClass.Train(Inputs: TNN2DArray; Expected_predict: Double): TNN2DMemory;
  75. var
  76.  inputs_1, outputs_1: TNN1DArray;
  77.  inputs_2, outputs_2: Double;
  78.  Actual_predict: Double;
  79.  K, E: Integer;
  80.  
  81.  error_layer_1: TNN1DArray;
  82.  weights_delta_layer_1: Double;
  83.  error_layer_2, gradient_layer_2, weights_delta_layer_2, gradient_layer_1 : Double;
  84. begin
  85.  
  86.  inputs_1 :=  Dot(weights_0_1, Inputs);
  87.  
  88.  for K := 0 to 1 do
  89.   outputs_1[K] :=  Sigmoid(inputs_1[K]);
  90.  
  91.  
  92.  inputs_2 :=  Dot(weights_1_2, outputs_1);  //To Output
  93.  
  94.  outputs_2 := Sigmoid(inputs_2);
  95.  Actual_predict := outputs_2;
  96.  
  97.  
  98.  error_layer_2 := actual_predict - expected_predict;
  99.  gradient_layer_2 := actual_predict * (1 - actual_predict);
  100.  weights_delta_layer_2 := error_layer_2 * gradient_layer_2;
  101.  
  102.  for K := 0 to 1 do
  103.   weights_1_2[K] := weights_1_2[K] - (outputs_1[K]* weights_delta_layer_2 * learning_rate);
  104.  
  105.  for K := 0 to 1 do
  106.   begin
  107.    error_layer_1[K] := weights_1_2[K] * weights_delta_layer_2;
  108.    gradient_layer_1 := (outputs_1[K] * (1 - outputs_1[K]));  //5 * 4 un 4 * 3
  109.    weights_delta_layer_1 := error_layer_1[K] * gradient_layer_1;
  110.  
  111.   for E := 0 to 2 do
  112.    Weights_0_1[K][E] := weights_0_1[K][E] - (Inputs[E] * weights_delta_layer_1 * learning_rate);
  113.   end;
  114.  
  115.  Result := weights_0_1;
  116. end;
  117.  
  118.  
  119. function NNTestClass.Predict(InputData: TNNInputs): Double;
  120. var
  121.  inputs_1, outputs_1 : TNN1DArray;
  122.  inputs_2, outputs_2: Double;
  123. begin
  124.  inputs_1 := Dot(weights_0_1, InputData.NNInputs);
  125.  
  126.  
  127.  outputs_1[0] := Sigmoid(inputs_1[0]);
  128.  outputs_1[1] := Sigmoid(inputs_1[1]);
  129.  
  130.  
  131.  inputs_2 := Dot(weights_1_2, outputs_1);
  132.  outputs_2 := Sigmoid(inputs_2);
  133.  
  134.  Result :=  outputs_2;
  135. end;
  136.  
  137. procedure NNTestClass.init;
  138. var
  139.  K, E: Integer;
  140. begin
  141.  for E := 0 to 1 do
  142.   for K := 0 to 2 do
  143.    weights_0_1[E][K] := RandomRangeF(-0.1, 1.0);
  144.  
  145.  for K := 0 to 1 do
  146.   weights_1_2[K] := Random - Random;
  147.  
  148.   learning_rate := 0.1;
  149. end;
  150.  
  151. function NNTestClass.RandomRangeF(min, max: Double): Double;
  152. var
  153.  Float : Double;
  154. begin
  155.  Randomize;
  156.  Float := Random;
  157.  Result := (min + Float) * (max - min);
  158. end;
  159.  
  160. function NNTestClass.Sigmoid(X: Double): Double;
  161. begin
  162.  Result :=  1 / (1 + Exp(- X))
  163. end;
  164.  
  165.  
  166. end.
  167.  
  168. #-------
  169.  
  170. unit Unit5;
  171.  
  172. interface
  173.  
  174. uses
  175.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  176.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit1;
  177.  
  178. type
  179.   TForm5 = class(TForm)
  180.     Memo1: TMemo;
  181.     Button1: TButton;
  182.     Button2: TButton;
  183.     Button3: TButton;
  184.     procedure Button1Click(Sender: TObject);
  185.     procedure Button2Click(Sender: TObject);
  186.     procedure FormCreate(Sender: TObject);
  187.   private
  188.  
  189.   public
  190.  
  191.   end;
  192.  
  193. var
  194.   Form5: TForm5;
  195.  
  196. implementation
  197.  
  198. {$R *.dfm}
  199.  
  200. function Activation (X: Double): Double;
  201. begin
  202.  Result := 0;
  203.  
  204.  if X  >= 0.50 then
  205.   Result := 1.0;
  206. end;
  207.  
  208.  
  209. procedure TForm5.Button1Click(Sender: TObject);
  210. var
  211.  MMry: TNN2DMemory;
  212.  K, E: Integer;
  213. begin
  214.  for E := 0 to  10000 do
  215.   begin
  216.    for K := Low(TrainingData) to High(TrainingData)  do
  217.     MMry := NN.Train(TrainingData[K].NNInputs, TrainingData[K].State);
  218.   end;
  219.  Form5.Memo1.Lines.Add(Format('Brain: %f, %f, %f, - %f, %f, %f,',[MMry[0][0], MMry[0][1], MMry[0][2] ,MMry[1][0], MMry[1][1], MMry[1][2]]));
  220. end;
  221.  
  222. procedure TForm5.Button2Click(Sender: TObject);
  223. var
  224.  K: Integer;
  225.  R: Double;
  226. begin
  227.  for K := Low(TrainingData) to High(TrainingData)  do
  228.   begin
  229.    R := NN.Predict(TrainingData[K]);
  230.    Form5.Memo1.Lines.Add(Format('Excepted: %f Predicted : %f (%f)',[TrainingData[K].State, Activation(R), R]));
  231.   end;
  232. end;
  233.  
  234. procedure TForm5.FormCreate(Sender: TObject);
  235. begin
  236.  NN := NNTestClass.create;
  237.  NN.init;
  238. end;
  239.  
  240. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement