Initialisation d'une pile de réseaux de neurones.

Initialisation d'une pile de réseaux de neurones. - Ada - Programmation

Marsh Posté le 27-08-2010 à 15:20:34    

Bonjour,
   Je désire Initialiser une pile de réseaux de neurones formels de sorte que la sortie de la dernière couche soit l'entrée de la première et la sortie de la première l'entrée de la suivante et ainsi de suite pour pourvoir tourner en boucle.
   Je suis dessus depuis trois jour, et le seul moyen qui me viens à l'esprit à présent est une initialisation "statique".
 
Voici mon code :
 

Code :
  1. with PragmARC.REM_NN_Wrapper;
  2. use PragmARC.REM_NN_Wrapper;
  3.  
  4. with PragmARC.Math.Functions;
  5. with PragmARC.Ansi_Tty_Control;
  6. use PragmARC.Ansi_Tty_Control;
  7.  
  8.  
  9. with Generic_Extended_Binary_Code;
  10.  
  11. with Calendar;
  12. use Calendar;
  13.  
  14. with Text_Io;
  15. use Text_Io;
  16.  
  17. with Ada.Command_Line;
  18. use Ada.Command_Line;
  19.  
  20. package body Intelligent_Desing is
  21.  
  22.  
  23.   package Coded_Word is new Generic_Extended_Binary_Code(T_Language);
  24.   use Coded_Word;
  25.  
  26.   subtype T_Layer_Id is Natural range 1..8;
  27.  
  28.   task type T_NN_Layer(Id : T_Layer_Id) is
  29.      entry Respond(Data : in Node_Set;
  30.                    Response : out Node_set);
  31.   end T_NN_Layer;
  32.  
  33.   type Layer_Access is access T_NN_Layer;
  34.  
  35.  
  36.   package Real_Math is new PragmARC.Math.Functions (Supplied_Real => Real);
  37.   package Real_Io is new Text_Io.Float_Io(Real);
  38.  
  39.   type T_Data is record
  40.      Data : Node_Set(1..T_Code'Length*Sentence_Length) := (others => 0.0);
  41.      Response : Node_Set(1..T_Code'Length*Sentence_Length) := (others => 0.0);
  42.   end record;
  43.  
  44.  
  45.   type T_Data_Stack is array (1..8) of T_Data;
  46.  
  47.  
  48.   task body T_NN_Layer is
  49.  
  50.      Date : Time := Clock + 60.0;
  51.      Data_Stack : T_Data_Stack;
  52.      Stack_Index : Natural := 0;
  53.      Buffer : Node_Set(1..T_Code'Length*Sentence_Length) := (others => 0.0);
  54.  
  55.   begin
  56.      if Argument_Count > 0 and then
  57.        Argument(1) = "-i" then
  58.         declare
  59.            procedure Get_Init(Pattern : in Positive;
  60.                               Input : out Node_Set;
  61.                               Desired : out Node_Set) is
  62.            begin
  63.  
  64.               Input := (others => 0.0);
  65.               Desired := (others => 0.0);
  66.            end Get_Init;
  67.  
  68.            package NN_Init is new REM_NN
  69.              (
  70.               Num_Input_Nodes => Sentence_Length * T_Code'Length,
  71.               Num_Hidden_Nodes => Sentence_Length,
  72.               Num_Output_Nodes => Sentence_Length * T_Code'length,
  73.               Num_Patterns => 1,
  74.               New_Random_Weights => true,
  75.               Input_To_Output_Connections => False,
  76.               Weight_File_Name => "network" & T_Layer_Id'Image(Id) & ".wgt",
  77.               Get_Input => Get_Init
  78.               );
  79.  
  80.            use NN_Init;
  81.         begin
  82.            NN_Init.Train;
  83.            NN_Init.Save_Weights;
  84.         end;
  85.      end if;
  86.  
  87.      loop
  88.         select
  89.            accept Respond(Data : in Node_Set;
  90.                           Response : out Node_set) do
  91.               declare
  92.                  procedure Get(Pattern : in Positive;
  93.                                Input : out Node_Set;
  94.                                Desired : out Node_Set) is
  95.                  begin
  96.  
  97.                     Input := Data;
  98.                     Desired := (others => 0.0);
  99.                  end Get;
  100.  
  101.  
  102.                  package NN is new REM_NN
  103.                    (
  104.                     Num_Input_Nodes => Sentence_Length * T_Code'Length,
  105.                     Num_Hidden_Nodes => Sentence_Length,
  106.                     Num_Output_Nodes => Sentence_Length * T_Code'length,
  107.                     Num_Patterns => 1,
  108.                     New_Random_Weights => False,
  109.                     Input_To_Output_Connections => False,
  110.                     Weight_File_Name => "network" & T_Layer_Id'Image(Id) & ".wgt",
  111.                     Get_Input => Get
  112.                     );
  113.  
  114.                  use NN;
  115.  
  116.               begin
  117.                  Put("Layer_id : " & Natural'Image(Id));
  118.                  Put("Respond..." );
  119.                  NN.Respond(1,Response);
  120.                  Put("Respond done." );
  121.                  for I in Response'Range loop
  122.                     if Response(I) > 0.5 then
  123.                        Response(I) := 1.0;
  124.                     else
  125.                        Response(I) := 0.0;
  126.                     end if;
  127.                  end loop;
  128.               end;
  129.               Put("Push data into the stack..." );
  130.               if Stack_Index < Data_Stack'Length then
  131.                  Data_Stack(Stack_Index + 1) := (Buffer, Data);
  132.                  Stack_Index := Stack_Index + 1;
  133.               end if;
  134.               Put("Push done." );
  135.               Buffer := response;
  136.               Date := Clock + 60.0;
  137.            end Respond;
  138.         or
  139.            delay until Date;
  140.            if Stack_Index /= 0 then
  141.               declare
  142.  
  143.                  procedure Get_Expl(Pattern : in Positive;
  144.                                     Input : out Node_Set;
  145.                                     Desired : out Node_Set) is
  146.                  begin
  147.  
  148.                     Input := Data_Stack(Pattern).data;
  149.                     Desired := Data_Stack(Pattern).Response;
  150.                  end Get_Expl;
  151.  
  152.  
  153.                  package NN_Expl is new REM_NN
  154.                    (
  155.                     Num_Input_Nodes => Sentence_Length * T_Code'Length,
  156.                     Num_Hidden_Nodes => Sentence_Length,
  157.                     Num_Output_Nodes => Sentence_Length * T_Code'length,
  158.                     Num_Patterns => Stack_index,
  159.                     New_Random_Weights => False,
  160.                     Input_To_Output_Connections => False,
  161.                     Weight_File_Name => "network" & T_Layer_Id'Image(Id) & ".wgt",
  162.                     Get_Input => Get_Expl
  163.                     );
  164.  
  165.                  use NN_Expl;
  166.  
  167.  
  168.                  Desired, Response : Node_Set(1..Sentence_Length * T_Code'Length) :=
  169.                    (others => 0.0);
  170.                  RMS_Error : Real := 0.0;
  171.                  Error     : Real := 0.0;
  172.                  Converged  : constant real := 1.0/Real(Stack_Index);
  173.                  Max_Epochs : constant Positive := 2500;
  174.                  Epoch : Natural := 0;
  175.               begin
  176.  
  177.                  loop
  178.  
  179.                 All_Patterns :
  180.                     for Pattern in 1..Stack_index Loop
  181.                        NN_Expl.Train;
  182.                        NN_Expl.Respond (Pattern, Response);
  183.                        for I in Response'Range loop
  184.                           Error :=
  185.                             Error + (Data_Stack(Pattern).Response(i) - Response(i) );
  186.                        end loop;
  187.                        RMS_Error := RMS_Error + ((Error/Real(Response'Length)) ** 2);
  188.                        Error := 0.0;
  189.                     end loop All_Patterns;
  190.                     RMS_Error := Real_Math.Sqrt(RMS_Error / Real (Stack_index)) ;
  191.                     if Epoch > 50 and then
  192.                       ((RMS_Error <= Converged) or
  193.                       (Epoch >= Max_Epochs)) then
  194.                        exit;
  195.                     else
  196.                        Text_Io.Put(Position(Id, 1));
  197.                        Text_Io.Put ("Epoch" );
  198.                        Text_Io.Put (Integer'Image (Epoch) );
  199.                        Text_Io.Put(" => RMS_Error: " );
  200.  
  201.                        Real_Io.Put(RMS_Error);
  202.  
  203.                     end if;
  204.  
  205.                     Epoch := Epoch + 1;
  206.                  end loop;
  207.                  NN_Expl.Save_Weights;
  208.               end;
  209.            end if;
  210.            Stack_Index := 0;
  211.            Date := Clock + 60.0;
  212.         end select;
  213.      end loop;
  214.   end T_NN_Layer;
  215.  
  216.   procedure Table2register(Table : in T_Lang_Array;
  217.                            Register : out Node_Set) is
  218.      Code : T_Code;
  219.   begin
  220.      for I in 0..Table'length-1 loop
  221.         Code := Code_Of(Table(I+1));
  222.         for J in T_Code'Range loop
  223.            Register(I*T_Code'Length+J) := Code(J);
  224.         end loop;
  225.      end loop;
  226.   end Table2register;
  227.  
  228.   procedure Register2table(Register : in Node_Set;
  229.                            Table    : out  T_Lang_Array) is
  230.      Code : T_Code;
  231.   begin
  232.      for I in 0..Table'length-1 loop
  233.         Code := Register(I*T_Code'Length+1..I*T_Code'Length+T_Code'Length);
  234.         Table(I+1) := Item_Of(Code);
  235.      end loop;
  236.   end Register2table;
  237.  
  238.  
  239.  
  240.   type T_Layer_Stack is array(T_Layer_Id'range) of Layer_access;
  241.  
  242.   task body Life_Cycle is
  243.  
  244.      Brain : T_Layer_Stack;
  245.  
  246.      Input, Output : Node_Set(1..T_Code'Length*Sentence_Length) := (others => 0.0);
  247.  
  248.      Section : T_Layer_Id := T_Layer_Id'first;
  249.      Available : Boolean := False;
  250.   begin
  251.  
  252.      for I in brain'Range loop
  253.         Brain(I) := new T_NN_Layer(I);
  254.      end loop;
  255.  
  256.      loop
  257.         select
  258.            accept Compute(Data : in T_Lang_Array;
  259.                           Response : out T_Lang_Array) do
  260.               Table2register(Data, Input);
  261.  
  262.               for I in Reverse T_Layer_Id'First..section loop
  263.                  select
  264.                     Brain(I).Respond(Input, Output);
  265.                     Input := Output;
  266.                  or
  267.                     delay 1.0;
  268.                     exit;
  269.                  end select;
  270.               end loop;
  271.               if Section < T_Layer_Id'Last then
  272.                  Section := Section + 1;
  273.               else
  274.                  Section := T_Layer_Id'First;
  275.               end if;
  276.               Register2table(Output, Response);
  277.            end Compute;
  278.         or
  279.            when Available =>
  280.               accept Compute(Info : out T_Lang_Array) do
  281.                  Register2table(Output, Info);
  282.                  Available := False;
  283.               end Compute;
  284.         or
  285.            delay 180.0;
  286.            for I in Reverse T_Layer_Id'First..section loop
  287.               Brain(I).Respond(Output, Input);
  288.               Output := input;
  289.            end loop;
  290.            if Section < T_Layer_Id'Last then
  291.               Section := Section + 1;
  292.            else
  293.               Section := T_Layer_Id'First;
  294.            end if;
  295.            Available := True;
  296.         end select;
  297.      end loop;
  298.   end Life_Cycle;
  299.  
  300. end Intelligent_Desing;


 
Je prend toute les idées. Merci pour votre aide.


Message édité par Profil supprimé le 27-08-2010 à 15:20:55
Reply

Marsh Posté le 27-08-2010 à 15:20:34   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed