redes - java configuración de red neuronal simple
redes neuronales ejemplos (2)
Decidí 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 la simulación XOR del principiante típico:
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 simple para modelar el diagrama de Jeff Heaton:
Sin embargo, quería asegurarme de que mi implementación para la clase Neuron sea correcta ... Ya he probado todas las entradas posibles ([verdadero verdadero], [verdadero falso], [falso verdadero], [falso falso]), y todas pasaron Mi verificación manual. Además, como este programa acepta las entradas como argumentos, también parece pasar la verificación manual para entradas como [verdadero falso falso], [verdadero verdadero falso], etc.
Pero hablando conceptualmente, ¿sería correcta esta implementación? ¿O cómo puedo mejorarlo antes de comenzar un mayor desarrollo e investigación sobre este tema?
¡Gracias!
Del trabajo (limitado) que he hecho con las redes neuronales, la implementación y el modelo me parecen correctos: el resultado es lo que yo esperaba y la fuente parece sólida.
Parece un buen punto de partida. Tengo algunas sugerencias:
Para la escalabilidad, el fuego () debe ser reestructurado para que una neurona que ya está activada con el conjunto de entrada actual no tenga que volver a calcular cada vez. Este sería el caso si tuviera otra capa oculta o más de un nodo de salida.
Considera dividir tu cálculo de umbral en su propio método. Luego puede subclasificar Neuron y usar diferentes tipos de funciones de activación (bipolar sigmoide, RBF, lineal, etc.).
Para aprender funciones más complejas, agregue una entrada de sesgo 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).
No olvides permitir los métodos de entrenamiento. La propagación hacia atrás necesitará algo como el inverso de fuego (), para tomar una salida objetivo y ondular los cambios de peso a través de cada capa.