2011-01-18 22 views
22

He decidido jugar con algunos conceptos simples que involucran redes neuronales en Java, y al adaptar el código algo inútil que encontré en un foro, he podido crear un modelo muy simple para principiantes típicos simulación XOR:configuración de red neuronal java simple


public class MainApp { 
    public static void main (String [] args) { 
     Neuron xor = new Neuron(0.5f); 
     Neuron left = new Neuron(1.5f); 
     Neuron right = new Neuron(0.5f); 
     left.setWeight(-1.0f); 
     right.setWeight(1.0f); 
     xor.connect(left, right); 

     for (String val : args) { 
      Neuron op = new Neuron(0.0f); 
      op.setWeight(Boolean.parseBoolean(val)); 
      left.connect(op); 
      right.connect(op); 
     } 

     xor.fire(); 

     System.out.println("Result: " + xor.isFired()); 

    } 
} 

public class Neuron { 
    private ArrayList inputs; 
    private float weight; 
    private float threshhold; 
    private boolean fired; 

    public Neuron (float t) { 
     threshhold = t; 
     fired = false; 
     inputs = new ArrayList(); 
    } 

    public void connect (Neuron ... ns) { 
     for (Neuron n : ns) inputs.add(n); 
    } 

    public void setWeight (float newWeight) { 
     weight = newWeight; 
    } 

    public void setWeight (boolean newWeight) { 
     weight = newWeight ? 1.0f : 0.0f; 
    } 

    public float getWeight() { 
     return weight; 
    } 

    public float fire() { 
     if (inputs.size() > 0) { 
      float totalWeight = 0.0f; 
      for (Neuron n : inputs) { 
       n.fire(); 
       totalWeight += (n.isFired()) ? n.getWeight() : 0.0f; 
      } 
      fired = totalWeight > threshhold; 
      return totalWeight; 
     } 
     else if (weight != 0.0f) { 
      fired = weight > threshhold; 
      return weight; 
     } 
     else { 
      return 0.0f; 
     } 
    } 

    public boolean isFired() { 
     return fired; 
    } 
} 

en mi clase principal, he creado la simulación sencilla en el diagrama de modelado de Jeff Heaton: XOR diagram

Sin embargo, quería asegurarse de que mi aplicación para la clase de neurona es cor rect .. Ya he probado todas las entradas posibles ([true true], [true false], [false true], [false false]), y todas pasaron mi verificación manual. Además, dado que este programa acepta las entradas como argumentos, también parece pasar la verificación manual de entradas como [verdadero falso falso], [verdadero verdadero falso], etc.

Pero conceptualmente hablando, ¿sería correcta esta implementación? ? ¿O cómo puedo mejorarlo antes de comenzar un mayor desarrollo e investigación sobre este tema?

¡Gracias!

+0

sólo para ahorrar memoria en aplicaciones más grandes que tienen la CPU es necesario, puede ser que sea mejor añadir una tasa de atenuación, cuyo valor se puede definir en un segundo constructor – user2425429

Respuesta

0

A partir del trabajo (limitado) que he hecho con redes neuronales, esa implementación y modelo me parecen correctos: la salida es lo que esperaría y la fuente se ve sólida.

+1

Gracias por su respuesta, de cualquier experiencia que tiene, ¿Hay algún problema que vea en la escalabilidad de esta clase de Neuron? Desde mi punto de vista, he tratado de hacer que sea lo suficientemente escalable como para acomodarse a múltiples capas internas de neuronas, pero dos perspectivas son mejores que una. – jerluc

9

Parece un buen punto de partida. Tengo algunas sugerencias:

  1. para la escalabilidad, el fuego() debe ser reestructurado para que una neurona que ya se disparó con el conjunto de entrada actual no tiene que volver a calcular cada vez. Este sería el caso si tuviera otra capa oculta o más de un nodo de salida.

  2. Considere dividir su umbral calc en su propio método. Luego puede subclasificar a Neuron y usar diferentes tipos de funciones de activación (sigmoide bipolar, RBF, lineal, etc.).

  3. Para aprender funciones más complejas, agregue una entrada de polarización a cada neurona. Básicamente es como otra entrada con su propio valor de peso, pero la entrada siempre se fija en 1 (o -1).

  4. No olvide permitir los métodos de entrenamiento. La retropropagación necesitará algo así como el inverso de fuego(), para tomar una producción objetivo y ondular los cambios de peso a través de cada capa.

+2

¡Gracias por sus sugerencias! Sin embargo, tendré que investigar mucho más sobre el tema, ya que estoy muy lejos de saber lo que la mayoría de lo que sugirió significa jaja – jerluc

Cuestiones relacionadas