2012-02-13 25 views
8

Estoy tratando de escribir la clase de red neuronal Hopfield en Java, pero la red no quiere reconocer patrones. Y no puedo entender dónde está el error. La red representa con la matriz de interconexión w [n] [n]. Cuando la red se enseña con algún patrón estándar que cambiar la matriz de interconexión con método siguiente:Red neuronal de Hopfield no reconoce

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

entonces trato de reconocer el patrón estándar en algún patrón similar. El proceso debe ser detenido cuando el estado de las neuronas dejar de cambiar o cuando se supera el umbral (65535 iteraciones):

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 es una función de activación:

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

} 

proceso de reconocimiento sólo se detiene cuando se pasa de umbral. Y el patrón de salida no se parece a un patrón estándar. Por favor ayuda a encontrar el error. Gracias de antemano.

P.S. El problema esta resuelto. error principal fue que se me olvidó fijar a cero la variable 'red' en el inicio 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]; 
     ... 
    } 
} 

Gracias por la atención.

+0

pensé Java ya tiene 'Math.signum (x) para el método' doble y flotar de entrada de ¿X? Su versión ignora cero (0) si x = 0. Consulte el enlace http://en.wikipedia.org/wiki/Signum_function –

+0

Mi versión no ignora x = 0. Cuando x = 0, signum (x) = - 1. El vector de patrón solo puede constar de valores "1" o "-1". – user1020946

+0

¿Por casualidad estás en el curso de redes neuronales de Hinton? – Nayuki

Respuesta

3

error principal fue que olvidé pone a cero la variable 'red' en el inicio 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]; 
     ... 
    } 
} 
Cuestiones relacionadas