2012-02-13 32 views
8

Sto provando a scrivere la classe di rete neurale di Hopfield in Java, ma la rete non vuole riconoscere i modelli. E non riesco a capire dove sia l'errore. La rete rappresenta con la matrice di interconnessione w [n] [n]. Quando rete viene insegnata con qualche modello standard cambio la matrice di interconnessione con il metodo seguente:La rete neurale di Hopfield non riconosce

private void teaching(int[] pattern){ //teaching 
    for(int i=0; i<n; i++) 
     for(int j=0; j<n; j++){ 
      if(i==j) w[i][j]=0; 
      else w[i][j] += pattern[i]*pattern[j]; 
     } 
} 

poi provo a riconoscere schema standard in qualche modello simile. Il processo deve essere interrotto quando lo stato di neuroni arresto cambiare o quando soglia (65535 iterazioni) è superato:

private int[] recognition(int[] pattern){ 
    int net=0, s, j=0;   
    int[] previousState = new int[n]; 
    do{ 
     System.arraycopy(pattern, 0, previousState, 0, n); 
     int r = generateRandom(n); 
     for(int i=0; i<n; i++) 
      net+=pattern[i]*w[i][r];   
     s = signum(net); 
     pattern[r] = s; 
     j++; 
     if(j>iterThreshold){ 
      System.err.println("Threshold overcome."); 
      return pattern; 
     } 
    }while(!Arrays.equals(pattern, previousState)); 
    return pattern; 
} 

signum è una funzione di attivazione:

private static int signum(int x){ //activation function 
    if(x>0) return 1; 
    else return -1; 

} 

processo di riconoscimento ferma solo quando viene passato soglia. E il modello non sembra un modello standard. Si prega di aiutare a trovare l'errore. Grazie in anticipo.

P.S. Il problema è risolto. errore principale è stato che ho dimenticato di impostare alla variabile zero 'net' l'inizio del ciclo:

private int[] recognition(int[] pattern){ 
    int net=0, s, j=0;   
    ... 
    do{ 
     net=0; 
     for(int i=0; i<n; i++) 
      net+=pattern[i]*w[i][r]; 
     ... 
    } 
} 

Grazie per l'attenzione.

+0

ho pensato che Java ha già 'Math.signum (x)' per doppio e galleggiare ingresso X? La tua versione ignora zero (0) se x = 0. Vedi il link http://en.wikipedia.org/wiki/Signum_function –

+0

La mia versione non ignora x = 0. Quando x = 0, signum (x) = - 1. Il modello vettoriale può contenere solo valori "1" o "-1". – user1020946

+0

Per caso ti trovi nel corso delle reti neurali di Hinton? – Nayuki

risposta

3

errore principale è stato che ho dimenticato di impostare alla variabile zero 'net' l'inizio del ciclo:

private int[] recognition(int[] pattern){ 
    int net=0, s, j=0;   
    ... 
    do{ 
     net=0; 
     for(int i=0; i<n; i++) 
      net+=pattern[i]*w[i][r]; 
     ... 
    } 
} 
Problemi correlati