Sous-bibliothèque d'exploitation de RdN

Sous-bibliothèque d'exploitation de RdN - Divers - Programmation

Marsh Posté le 03-03-2011 à 23:53:52    

Bonjour,
     Je poste dans divers pour avoir plus de chance.
 
     Je souhaiterais avoir votre avis sur mon développement.
 
     Je développe, avec le langage Ada, un agent de dialogue basé sur l'exploitation des réseaux de neurones.
 
     Je n'ai pas écrit le réseau moi même. J'utilise la bibliothèque de PragmARC REM_NN_Wrapper dont voici la spécification.
 

Code :
  1. -- PragmAda Reusable Component (PragmARC)
  2. -- Copyright (C) 2000 by PragmAda Software Engineering.  All rights reserved.
  3. -- **************************************************************************
  4. --
  5. -- A Recursive Error Minimization (REM) neural network
  6. -- Easy to use, fast, & robust
  7. -- Need only specify Num_Input_Nodes, Num_Hidden_Nodes, Num_Output_Nodes, & Num_Patterns
  8. -- If Num_Patterns is not easily determined, set it & R to 1
  9. -- Set New_Random_Weights to False & Num_Patterns to 1 to use a previously trained network
  10. -- Set Weight_File_Name as desired
  11. -- Default values for all other parameters should be satisfactory
  12. --
  13. -- History:
  14. -- 2000 May 01     J. Carter          V1.0--Initial release
  15. --
  16. with System;
  17. package PragmARC.REM_NN_Wrapper is
  18.   type Real is digits System.Max_Digits; -- Inputs and outputs of the network
  19.   subtype Natural_Real  is Real range 0.0              .. Real'Safe_Last;
  20.   subtype Positive_Real is Real range Real'Model_Small .. Real'Safe_Last;
  21.  
  22.   type Node_Set is array (Positive range <> ) of Real;
  23.  
  24.   generic -- REM_NN
  25.      Num_Input_Nodes  : Positive; -- Network architecture
  26.      Num_Hidden_Nodes : Natural;
  27.      Num_Output_Nodes : Positive;
  28.  
  29.      Num_Patterns : Positive; -- # of different desired output sets to save & transition
  30.  
  31.      New_Random_Weights          : Boolean := True; -- False to reuse weights for testing, use, etc.
  32.      Input_To_Output_Connections : Boolean := True; -- Must be True if Num_Hidden_Nodes = 0
  33.      Thinning_Active             : Boolean := True;
  34.  
  35.      -- Network parameters
  36.      Beta : Positive_Real := 0.1; -- Learning rate; 0.1 has always been satisfactory so far
  37.  
  38.      -- Recursive means' characteristic lengths:
  39.      P : Positive_Real := 16.0 * Real'Max (Real'Max (Real (Num_Patterns), Real (Num_Input_Nodes) ), Real (Num_Output_Nodes) );
  40.        -- P controls error & denominator of learning rule
  41.      Q : Positive_Real := 0.25 * P; -- Momentum
  42.      R : Positive_Real := Q; -- Transition of desired output
  43.      S : Positive_Real := 4.0 * P; -- G, for thinning
  44.  
  45.      -- Power-law recursive means: the corresponding recursive mean will change from an exponential to power-law mean when
  46.      -- the parameter * current experience # > corresponding parameter:
  47.      K_P : Natural_Real := 0.0; -- P
  48.      K_Q : Natural_Real := 0.0; -- Q
  49.      K_S : Natural_Real := 0.0; -- S
  50.  
  51.      -- Thinning parameters:
  52.      Ec       : Natural_Real := 0.001; -- A connection will be inactivated when its G value < Ec
  53.      Delta_Ec : Natural_Real := 0.001; -- A connection will be reactivated when its G value > Ec + Delta_Ec
  54.  
  55.      -- Random ranges: Random values will be selected from the range -X .. X, where X is one of:
  56.      Random_Weight_Range : Natural_Real := 0.1; -- Initial values for weights
  57.      Random_E_Star_Range : Natural_Real := 0.001; -- If > 0, the network will add random noise to E*
  58.      Random_H_Star_Range : Natural_Real := 0.001; -- Ditto
  59.  
  60.      -- File name: store, & possibly read, network values from this file
  61.      Weight_File_Name : String := "rem.wgt";
  62.  
  63.      with procedure Get_Input (Pattern : in Positive; Input : out Node_Set; Desired : out Node_Set);
  64.      -- Gets an input pattern & associated desired output pattern for this pattern #
  65.      -- Called during initialization & by Respond
  66.      -- IMPORTANT:
  67.      -- Since Get_Input is called during the initialization of this package, it must have been elaborated before this package
  68.      -- is instantiated
  69.      -- In practical terms, this means the procedure body of the actual procedure associated with Get_Input must occur before
  70.      -- the instantiation of this package
  71.   package REM_NN is
  72.      subtype Output_Id is Positive range 1 .. Num_Output_Nodes;
  73.      subtype Output_Set is Node_Set (Output_Id);
  74.  
  75.      procedure Respond (Pattern : in Positive; Output : out Output_Set);
  76.      -- Calls Get_Input for this pattern #, and propagates the input through the network to obtain the network's response
  77.  
  78.      procedure Train;
  79.      -- Propagates error & derivative backward through the network, & updates the network's weights
  80.  
  81.      procedure Save_Weights;
  82.      -- Saves the network's values in the files with supplied names
  83.  
  84.      Invalid_Architecture : exception;
  85.      -- This package can be initialized with Num_Hidden_Nodes = 0 and Input_To_Output_Connections = False
  86.      -- That combination represents an invalid network architecture
  87.      -- The initialization of this package checks for this condition, and raises Invalid_Architecture if it exists
  88.   end REM_NN;
  89. end PragmARC.REM_NN_Wrapper;
  90. --
  91. -- This is free software; you can redistribute it and/or modify it under
  92. -- terms of the GNU General Public License as published by the Free Software
  93. -- Foundation; either version 2, or (at your option) any later version.
  94. -- This software is distributed in the hope that it will be useful, but WITH
  95. -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  96. -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  97. -- for more details. Free Software Foundation, 59 Temple Place - Suite
  98. -- 330, Boston, MA 02111-1307, USA.
  99. --
  100. -- As a special exception, if other files instantiate generics from this
  101. -- unit, or you link this unit with other files to produce an executable,
  102. -- this unit does not by itself cause the resulting executable to be
  103. -- covered by the GNU General Public License. This exception does not
  104. -- however invalidate any other reasons why the executable file might be
  105. -- covered by the GNU Public License.

 
 
Comme vous pouvez le voir, bon nombre des paramètres génerique du paqutage REM_NN sont initialisés par défaut.
 
J'instancie toujours ce paquetage de la même manière : (les autre paramettre ne me sont pas utile).
 

Code :
  1. package NN_Expl is new REM_NN
  2.                 (
  3.                  Num_Input_Nodes => N
  4.                  Num_Hidden_Nodes => M
  5.                  Num_Output_Nodes => N
  6.                  Num_Patterns => Count
  7.                  New_Random_Weights => False
  8.                  Input_To_Output_Connections => False,
  9.                  Weight_File_Name => Network.id.all & ".wgt"
  10.                  Get_Input => Get_Data
  11.                 );


 
Dans le but gérer un ensemble de réseaux, j'écris une sous-bibliothèque d'exploitation de REM_NN et j'aimerais avoir votre avis sur sa spécification.
 
Voici ce que j'ai écris :

Code :
  1. ith PragmARC.REM_NN_Wrapper;
  2. use PragmARC.REM_NN_Wrapper;
  3. generic
  4.   Width : Positive := 32;
  5.   Depth : Positive := 17;
  6. package Np.Arti.Neural_Network is
  7.   type Network_Type(id : access string) is
  8.      record
  9.         RMS_Error  : Real := 1.0;
  10.         Converged  : Real := 0.0;
  11.         Current_Epoch : Integer := 0;
  12.         Max_Epochs : Integer := 5000;
  13.      end record;
  14.   type Network_Access is access all Network_Type;
  15.   subtype Register_Type is Node_Set(1..Width*Depth);
  16.   type Stack_Type is array (Positive <> ) of Register_Type;
  17.   type Stack_Access is access all Stack_Type;
  18.  
  19.   task Nn_Train_Manager is
  20.      entry Train(Network        : in Network_Access;
  21.                  From           : in Stack_Access;
  22.                  Num_Patterns : in Positive);
  23.  
  24.      entry status(Id            : in String;
  25.                   RMS_Error     : out Real;
  26.                   Current_Epoch : out Integer);
  27.      entry Finalize(id          : in string);
  28.      entry Halt;
  29.   end Nn_Train_Manager;
  30.  
  31.   function Respond(Input : in Register_Type;
  32.                    Id    : in String) return Register_Type;
  33. end Np.Arti.Neural_Network;


 
L'entrée "Status" de la tache Nn_Train_Manager me permettra de savoir si l'apprentissage est terminé ou dans quel état il se trouve.
Id est le nom unique du propriétaire du réseau.
 
Cela vous semble t-il cohérent ?
Si non pourquoi ?
Vous feriez comment ?
Merci de votre contribution.
 
Edit : Je rajoute une entrée de tache Finalize pour supprimer le réseau de la liste en fin d'apprentissage.


Message édité par Profil supprimé le 04-03-2011 à 00:20:35
Reply

Marsh Posté le 03-03-2011 à 23:53:52   

Reply

Sujets relatifs:

Leave a Replay

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