Home | Develop | Download | Contact
testprog3.c
1 /*
2  * testprog3.c
3  *
4  * Copyright 2011 Fernando Pujaico Rivera <fernando.pujaico.rivera@gmail.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  *
21  */
22 
33 #include <stdlib.h>
34 #include <math.h>
35 #include <pds/pdsra.h>
36 #include <pds/pdsrv.h>
37 #include <pds/pdsnn.h>
38 
39 #include "octplot.h"
40 #include "data_work.h"
41 
42 int pds_vector_init_func(PdsVector *V,PdsUniform *RV,float (*func)(float));
43 float funcion(float n);
44 
45 int main(int argc, char** argv)
46 {
47  PdsNeuronML *MLayer=NULL;
48  PdsVector *X=NULL;
49  PdsVector *Y=NULL;
50  PdsUniform *RV=NULL;
51 
52  PdsNnNatural i,id,itera,iterb;
53  PdsNnNatural Ntraining=128;
54  PdsNnNatural Ntests=4;
55  PdsNnNatural MaxIter;
56  PdsNnReal Error;
57  PdsNnReal Alpha;
58 
59  // Creo una Random Variable
60  RV=pds_uniform_new(-1,1);
61 
62  // Creo el vector que indicará la cantidad de electrones por capa.
63  // 5 Capas.
64  PdsNnNatural Larray[]={32,64,42,28,14,7};
65 
66  // Creo El vector de entrada X.
67  X=pds_vector_new(Larray[0]);
68  // Creo El vector de entrada Y.
69  Y=pds_vector_new(Larray[5]);
70 
72 
73  MLayer=pds_neuronml_new_from_array(Larray,6);
75  pds_neuronml_init_u_uniform(MLayer,RV);
76  Alpha=0.6; pds_neuronml_set_alpha(MLayer,Alpha);
77  Error=0.1; pds_neuronml_set_max_error(MLayer,Error);
78  MaxIter=8192; pds_neuronml_set_max_iterations(MLayer,MaxIter);
79 
80  // Entrenando
81  id=0;
82  for(i=0;id<Ntraining;i++)
83  {
84  printf("\nEntrenamiento %4d: id=%4d\n",i,id);
85 
86  // Entrenando de forma negativa.
87  function_data_work_init_data0(X,Y);
88  pds_neuronml_training(MLayer,X,Y);
89  itera=pds_neuronml_training_results_printf(MLayer,"-1");
90 
91  // Entrenando de forma positiva.
92  function_data_work_init_data1(X,Y);
93  pds_neuronml_training(MLayer,X,Y);
94  iterb=pds_neuronml_training_results_printf(MLayer,"+1");
95 
96  if( (itera==0)&&(iterb==0) ) id++;
97  else id=0;
98 
99  }
100 
101  printf("\n\n");
102  // Iterando
103  for(i=0;i<Ntests;i++)
104  {
105  function_data_work_init_data1(X,Y);
106  pds_neuronml_iterate(MLayer,X,Y);
108  function_octplot_vector_in_png(X,"n","X[n]","octfilegood.m","xgood.png");
109  }
110 
111 
112  printf("\n");
113  for(i=0;i<Ntests;i++)
114  {
115  function_data_work_init_data0(X,Y);
116  pds_neuronml_iterate(MLayer,X,Y);
118  function_octplot_vector_in_png(X,"n","X[n]","octfilebad.m","xbad.png");
119  }
120 
121  pds_neuronml_free(MLayer);
122 
123  printf("\n");
124 
125  pds_vector_free(X);
126  pds_vector_free(Y);
127 
128  return EXIT_SUCCESS;
129 }
130 
PdsNnBool pds_neuronml_iterate_results_printf(const PdsNeuronML *MLayer, const char *Type)
Muestra los resultados de la iteración de la red neuronal multicapa NeuronML.
int pds_neuronml_set_max_error(PdsNeuronML *NeuronML, PdsNnReal MaxError)
Coloca el maximo margen error RMS aceptado en la salida de la estructura PdsNeuronML.
int pds_neuronml_init_weight_uniform(PdsNeuronML *NeuronML, PdsUniform *RV)
Inicializa todos los pesos usando una variable aleatoria uniforme.
PdsNeuronML * pds_neuronml_new_from_array(const PdsNnNatural *L, PdsNnNatural Nel)
Crea una estructura de tipo PdsNeuronML.
int pds_neuronml_set_alpha(PdsNeuronML *NeuronML, PdsNnReal Alpha)
Coloca el valor del factor de aprendizaje Alpha.
La estructura tipo PdsNeuronML . Esta estructura genera una red neuronal multi capa. Para usar incluir pds/pdsnn.h.
Definition: pdsneuronml.h:74
void pds_neuronml_free(PdsNeuronML *NeuronML)
Libera una neurona de tipo puntero PdsNeuronML.
int pds_neuronml_set_max_iterations(PdsNeuronML *NeuronML, PdsNnNatural MaxIter)
Coloca el máximo numero de iteraciones aceptado, cualquier valor mayor provoca que se detenga el algo...
unsigned int PdsNnNatural
Definition: pdsnnglobal.h:62
int pds_neuronml_iterate(PdsNeuronML *NeuronML, const PdsVector *Input, PdsVector *Output)
Itera la red neuronal multicapa NeuronML. .
float PdsNnReal
Definition: pdsnnglobal.h:52
int pds_neuronml_training(PdsNeuronML *NeuronML, const PdsVector *Input, PdsVector *Output)
Entrena la red neuronal multicapa NeuronML. Usa el valor de Output como entrenamiento, para finalizar carga el nuevo valor de salida en Output.
int pds_neuronml_init_u_uniform(PdsNeuronML *NeuronML, PdsUniform *RV)
Inicializa todos los umbrales U usando una variable aleatoria uniforme.
PdsNnNatural pds_neuronml_training_results_printf(PdsNeuronML *MLayer, const char *Type)
Muestra los resultados del entrenamiento de la red neuronal multicapa NeuronML.

Enlaces de interés

HomePage Bazaar Download Bug report Ayuda Developer Feed