2011-01-18 32 views
22

Ho deciso di giocare con alcuni concetti semplici che riguardano reti neurali in Java e, nell'adattare un codice un po 'inutile che ho trovato su un forum, sono stato in grado di creare un modello molto semplice per i principianti tipici simulazione XOR:java semplice configurazione di rete neurale


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; 
    } 
} 

nella mia classe principale, ho creato la simulazione semplice schema di modellazione Jeff Heaton: XOR diagram

Tuttavia, ho voluto garantire la mia implementazione per la classe Neuron è cor rect..ho già testato tutti i possibili input ([true true], [true false], [false true], [false false]), e hanno tutti superato la mia verifica manuale. Inoltre, poiché questo programma accetta gli input come argomenti, sembra anche passare la verifica manuale per input come [true false false], [true true false], ecc.

Ma concettualmente, questa implementazione sarebbe corretta ? O come posso migliorarlo prima di iniziare ulteriori sviluppi e ricerche su questo argomento?

Grazie!

+0

solo per salvare la memoria in applicazioni di grandi dimensioni che hanno la CPU necessarie, potrebbe essere meglio per aggiungere un tasso di decadimento, il cui valore può essere definito in un secondo costruttore – user2425429

risposta

0

Dal lavoro (limitato) che ho svolto con le reti neurali, l'implementazione e il modello mi sembrano corretti - l'output è quello che mi aspetterei e la sorgente sembra solida.

+1

Grazie per la risposta, da qualsiasi esperienza che avete, ci sono dei problemi che vedi nella scalabilità di questa classe Neuron? Dal mio punto di vista, ho cercato di renderlo sufficientemente scalabile per ospitare più strati interni di neuroni, ma due prospettive sono meglio di una. – jerluc

9

Sembra un buon punto di partenza. Io ho un paio di suggerimenti:

  1. Per la scalabilità, il fuoco() dovrebbe essere ristrutturata in modo che un neurone che è già sparato con il set di ingresso corrente non deve ricalcolare ogni volta. Questo sarebbe il caso se avessi un altro livello nascosto o più di un nodo di output.

  2. Considerare la suddivisione del calcolo della soglia nel proprio metodo. Quindi puoi creare una sottoclasse di neurone e utilizzare diversi tipi di funzioni di attivazione (sigmoide bipolare, RBF, lineare, ecc.).

  3. Per apprendere funzioni più complesse, aggiungere un input di polarizzazione a ciascun neurone. È fondamentalmente come un altro input con il proprio valore di peso, ma l'input è sempre fissato a 1 (o -1).

  4. Non dimenticare di consentire i metodi di allenamento. La backpropagation avrà bisogno di qualcosa come l'inverso di fire(), per ottenere un output target e ripple delle variazioni di peso attraverso ogni livello.

+2

Grazie per i vostri suggerimenti! Tuttavia, dovrò fare molte più ricerche sull'argomento, dato che mi sento lontano dal sapere cosa la maggior parte di ciò che hai suggerito significa haha – jerluc

Problemi correlati