Advertisement
cardel

Backpropagation

Jul 4th, 2016
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.90 KB | None | 0 0
  1. /*
  2. * Enlace 1: http://ccia.ei.uvigo.es/docencia/IA/ejemplo-BP.pdf
  3. * Enlace 2: https://www.youtube.com/watch?v=26fG4qE2hvY
  4. * Enlace 3: https://www.youtube.com/watch?v=zSVmxkwAU_M
  5. */
  6. public class Backpropagation2Xor {
  7.    
  8.     public static double sumatoriaM(double e1,double e2,double e3,double e4,double e5){
  9.         double sumatoria=0;
  10.         sumatoria= Math.pow(e1, 2)+Math.pow(e2, 2)+Math.pow(e3, 2)+Math.pow(e4, 2)+Math.pow(e5, 2);
  11.         return sumatoria;
  12.        
  13.        
  14.     }
  15.    
  16.    
  17.    
  18.     public static double f(double entrada){
  19.        
  20.         double z=0.0;
  21.         //funcion simoideal
  22.         z=(1)/(1+Math.pow(Math.E, -entrada));
  23.         return z;
  24.        
  25.         /*
  26.          * si n >> 0 entonces z1
  27.          * si n << 0 entonces z0
  28.          * */
  29.     }
  30.  
  31.    
  32.  
  33.     public static void main(String[] args) {
  34.         //1. Inicializamos los pesos del MLP.
  35.        
  36.  
  37.         double U0=-1.0; //umbral
  38.         double U1=-1.0;
  39.         double U2=-1.0;
  40.        
  41.         double a= 0.25;
  42.        
  43.         double W24=/*-17.20506886355809;*/2*Math.random()-1;
  44.         double W25=/*-17.205083868742673;*/2*Math.random()-1;
  45.         double W34=/*-6.187782754347626;*/2*Math.random()-1;
  46.         double W35=/*-6.18778268016949;*/2*Math.random()-1;
  47.         double W12=/*-295.88816065800427;*/2*Math.random()-1;
  48.         double W13=/*285.8350132709512;*/2*Math.random()-1;
  49.        
  50.        
  51.         //Para asegurarse forzo a que estos pesos estén entre 0 y 1.
  52.         //Ya que las situaciones X0=0, X1=0 y X0=1, X1=1 requieren que estos sean positivos
  53.        
  54.         double W0 = Math.random();
  55.         double W1 = Math.random();
  56.         double W2 = Math.random();
  57.         /*W24=0.25;
  58.         W25=-0.5;
  59.        
  60.         W34=-0.5;
  61.         W35=0.25;
  62.        
  63.         W12=0.5;
  64.         W13=0.5;
  65.          
  66.         //Dejo los pesos de estáticos
  67.         W0= 0.6;
  68.         W1= 0.6;
  69.         W2= 0.6;*/
  70.        
  71.    
  72.        
  73.         double peso24=W24;
  74.         double peso25=W25;
  75.         double peso34=W34;
  76.         double peso35=W35;
  77.         double peso12=W12;
  78.         double peso13=W13;
  79.        
  80.         double []X1={0.0, 0.0, 1.0, 1.0};
  81.         double []X2={0.0, 1.0, 0.0, 1.0};
  82.         double []td={0.0, 1.0, 1.0, 0.0};
  83.        
  84.         //2.Mientras la condicion de parada sea falsa ejecutamos los pasos 3 al 12.
  85.         double optenerEp=0.0;
  86.         int ciclo=0;
  87.         do{
  88.             System.out.println("************************ciclo: "+ciclo);
  89.             double sumatoriaP=0.0;
  90.             for(int i=0; i<=td.length-1;i++){
  91.                
  92.                 //3.aplicamos un vector de entrada Xp=[xp1,xp2........Xpn].
  93.                
  94.                
  95.                 //4.Calculamos los valores de entradas netas para la capa oculta.
  96.                 //para la neurona2
  97.                 double Neta2=(W24*X1[i])+ (W25*X2[i])+ (W1*U1);
  98.                 double Neta3=(W34*X1[i])+ (W35*X2[i])+ (W2*U2);
  99.                 //5.Calculamos la salidas de la capa oculta.
  100.            
  101.                 double i2=f(Neta2);
  102.                
  103.                 double i3=f(Neta3);    
  104.                
  105.                 //6.Calculamos los valores netos de entrada para la capa de salida.
  106.                 double Neta1 = (W12*i2) + (W13*i3)+ (W0*U0);
  107.                
  108.                 //7.Calculamos la salida de la red.
  109.                 double y1=f(Neta1);
  110.                 //System.out.println("Salida: "+y1+ " Salida real "+td[i]);
  111.                
  112.                
  113.                 //8.Calculamos los terminos de error para las unidades de salidas.
  114.                 //Esta es la rapidez de la variación del error
  115.                 double errorSalida1= (td[i]-y1)*y1*(1-y1);
  116.                
  117.                
  118.                 //9.Estimamos loa   de error para las unidades ocultas.
  119.                 double errorSalida2= i2*(1-i2)*W12*errorSalida1;
  120.                 double errorSalida3= i3*(1-i3)*W13*errorSalida1;
  121.                
  122.                 //10.Actualizamos los pesos en la capa de salida.
  123.                 W12=W12 + (a*errorSalida1*i2);
  124.                 W13=W13 + (a*errorSalida1*i3);
  125.                 W0 += (a*errorSalida1*U0);
  126.                
  127.                 //11.Actualizamos los pesos en la capa oculta.
  128.                 W24=W24 +(a*errorSalida2*X1[i]);
  129.                 W34=W34 +(a*errorSalida3*X1[i]);
  130.                
  131.                 W25=W25 +(a*errorSalida2*X2[i]);
  132.                 W35=W35 +(a*errorSalida3*X2[i]);
  133.                
  134.                 W1 += (a*errorSalida2*U1);
  135.                 W2 += (a*errorSalida3*U2);
  136.                
  137.                 //12.Verificamos si el error global cumplecon la  finalizar.
  138.                 //Asignamos(dpk-ypk) desde e1....en
  139.                 double e1=(td[i] - y1);
  140.                 double e2=(td[i] - i2);
  141.                 double e3=(td[i] - i3);
  142.                 double e4=0;
  143.                 double e5=0;
  144.                
  145.                 double sumatoriaM=sumatoriaM(e1,e2,e3,e4,e5);
  146.                
  147.                 sumatoriaP+=sumatoriaM;
  148.             }
  149.            
  150.         //System.out.println(   "actuales=> W24:"+W24+"  W25:"+W25+"  W34:"+W34+" W35:"+W35+"\nW12:"+W12+" W13:"+W13+"  W0:"+W0+"  W1:"+W1+"  W2:"+W2);
  151.         double Ep=(0.5)*sumatoriaP;
  152.         //System.out.println("Ep: "+Ep);
  153.         optenerEp=Ep;
  154.         ciclo=ciclo+1;
  155.        
  156.     }while(ciclo<10000);
  157.         System.out.println( "iniciale=> W24:"+peso24+"  W25:"+peso25+"  W34:"+peso34+" W35:"+peso35+" W12:"+peso12+" W13:"+peso13+"\n\n");
  158.         System.out.println( "finales=> W24:"+W24+"  W25:"+W25+"  W34:"+W34+" W35:"+W35+" W12:"+W12+" W13:"+W13);
  159.    
  160.         System.out.println("********************prueba: ");
  161.         //4.Calculamos los valores de entradas netas para la capa oculta.
  162.         //para la neurona2
  163.        
  164.         for(int i = 0; i<td.length;i++){
  165.             double Neta2=(W24*X1[i])+ (W25*X2[i])+W1*U1;
  166.             double Neta3=(W34*X1[i])+ (W35*X2[i])+W2*U2;   
  167.        
  168.             double i2=f(Neta2);
  169.             double i3=f(Neta3);    
  170.            
  171.             double Neta1= (W12*i2) + (W13*i3)+ (W0*U0);
  172.             double y1=f(Neta1);
  173.            
  174.             System.out.println("Salida esperada "+td[i]+" Salida red: "+y1);
  175.         }
  176.        
  177.        
  178.    
  179.     }
  180.  
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement