Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

lunes, 17 de febrero de 2014

Neurona Artificial (V). Puerta lógica XOR.

Esta vez vamos a ver como funciona un sistema neuronal teniendo los pesos ya calibrados especificamente para la resolución de puertas lógicas XOR. El funcionamiento es el siguiente:



























Voy a utilizar la notación bipolar(1,-1), que es la más usada en las redes neuronales artificiales por varias razones de peso y es que tiene un rango mayor, es más eficiente y más preciso que la notación binaria(0,1). Para la resolución del problema he elegido el Perceptrón Multicapa siguiente:
























He puesto dos neuronas en la capa oculta siguiendo una regla que suele dar buenos resultados que es la de multiplicar el número de entradas por el número de neuronas de salida, y así obtenemos el número de neuronas a poner en la capa central (llamada oculta):
 
H = N * M
H = 2 * 1
H = 2

N = Número de Entradas (2)
M = Número de Neuronas de Salida (1)
H = Número de Neuronas de la Capa Oculta.

Y un último detalle es la nomenclatura que suele utilizarse para identificar los pesos de una red neuronal:

















En el ejemplo el peso W21 está ubicado entre la primera entrada (x1) y la neurona 2.


Codigo:

//Perceptrón multicapa: Puerta Lógica XOR
package perceptronMultiCapa;

import java.util.Scanner;

public class RNeuronaXor {

    public static void main(String[] args) {
        //Introducción manual de las entradas x1, x2.
        System.out.println("Introduce Entrada X1 (1,-1)): ");
        Scanner leerX1 = new Scanner(System.in);
        double x1 = Double.parseDouble(leerX1.next());
        System.out.println("Introduce Entrada X2 (1,-1): ");
        Scanner leerX2 = new Scanner(System.in);
        double x2 = Double.parseDouble(leerX2.next());
        //Pesos ya calibrados para la resolución de puertas XOR.
        double w11 = -1.942779536696304;//Pesos neurona 1
        double w12 = -2.4033439922084954;
        double θ1 = -2.2690966258542424;
        double w21 = 1.476484576128277;//Pesos neurona 2

        double w22 = 1.5285706752204653;
        double θ2 = -1.2654579142409594;
        double w31 = -2.7857541174718032;//Pesos neurona 3
        double w32 = -2.81730152144229;
        double θ3 = -2.52832962325685;
        //Calculo de las salidas de las neuronas
        double y1 = Math.tanh((x1 * w11) + (x2 * w12) + (1 * θ1));
        double y2 = Math.tanh((x1 * w21) + (x2 * w22) + (1 * θ2));
        double y3 = Math.tanh((y1 * w31) + (y2 * w32) + (1 * θ3));
        y3 = (y3 >= 0) ? 1 : -1;
        //Mostrar resultado
        System.out.println("Salida (y3) = " + (int) y3);
    }

}



Resultado:

run:
Introduce Entrada X1 (1,-1)):
-1
Introduce Entrada X2 (1,-1):
1
Salida (y3) = 1
BUILD SUCCESSFUL (total time: 4 seconds)


4 comentarios:

  1. Podrias poner el codigo utilizado para el aprendizaje (como se obtuvieron los pesos)

    ResponderEliminar
  2. Podrias poner el codigo utilizado para el aprendizaje (como se obtuvieron los pesos)

    ResponderEliminar
  3. Respuestas
    1. Pruébalo tú mismo. Puedes obtener las referencias calculándolo tu mismo. Por ejemplo, no necesitas más que una red neuronal de 4 neuronas para obtener las puertas lógicas necesarias y con unos factores muy sencillos de obtener.

      Por ejemplo:

      O O
      |\ /|
      | O |
      \ | /
      O

      Prueba con los valores -0.2 (para los impulsos laterales), 0.5 (a los impulsos interiores) y 0.8 (para el del centro). Cada neurona/puerta lógica debe devolver un impulso cuando la suma de los valores obtenidos sea superior a 0.5

      Super sencillo y siempre devolverá los valores correctos de una función XOR, es decir:

      1|1|0
      1|0|1
      0|1|1
      0|0|0

      Eliminar

Con la tecnología de Blogger.