2012-02-13 12 views
8

Tôi đang cố gắng viết lớp mạng nơron Hopfield trong Java, nhưng mạng không muốn nhận dạng các mẫu. Và tôi không thể hiểu được đâu là sai lầm. Mạng đại diện với ma trận kết nối w [n] [n]. Khi mạng được dạy với một số mô hình tiêu chuẩn nào để thay đổi ma trận kết nối với phương pháp sau đây:Mạng Neural Hopfield không nhận ra

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

Sau đó, tôi cố gắng để nhận ra mô hình tiêu chuẩn trong một số mô hình tương tự. Quá trình này nên được dừng lại khi tình trạng tế bào thần kinh ngừng thay đổi hoặc khi ngưỡng (65535 lần lặp) được khắc phục:

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 là một chức năng kích hoạt:

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

} 

quá trình Recognition dừng chỉ khi ngưỡng được thông qua. Và mô hình không giống như mô hình chuẩn. Xin vui lòng giúp đỡ để tìm ra sai lầm. Cảm ơn bạn trước.

P.S. Vấn đề đã được giải quyết. sai lầm chính là tôi quên thiết lập để không biến 'net' trong khi bắt đầu chu kỳ:

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

Cám ơn sự chú ý.

+0

tôi nghĩ Java đã có 'Math.signum (x) 'phương pháp cho đôi và nổi đầu vào của x? Phiên bản của bạn bỏ qua số không (0) nếu x = 0. Xem liên kết http://en.wikipedia.org/wiki/Signum_function –

+0

Phiên bản của tôi không bỏ qua x = 0. Khi x = 0, ký hiệu (x) = - 1. Vector mẫu chỉ có thể bao gồm các giá trị "1" hoặc "-1". – user1020946

+0

Bạn có cơ hội tham gia vào mạng lưới thần kinh của Hinton không? – Nayuki

Trả lời

3

sai lầm chính là tôi quên thiết lập để không biến 'net' trong khi bắt đầu chu kỳ:

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