2012-02-13 25 views
8

मैं जावा में Hopfield तंत्रिका नेटवर्क वर्ग लिखने के लिए कोशिश कर रहा हूँ नहीं पहचानता है, लेकिन नेटवर्क पैटर्न पहचान करने के लिए नहीं करना चाहती। और मुझे समझ में नहीं आता कि गलती कहां है। नेटवर्क एक दूसरे का संबंध मैट्रिक्स डब्ल्यू [n] [n] के साथ प्रतिनिधित्व करता है। जब नेटवर्क कुछ मानक पैटर्न के साथ पढ़ाया जा रहा है मैं निम्नलिखित विधि के साथ एक दूसरे का संबंध मैट्रिक्स बदलने के लिए:Hopfield तंत्रिका नेटवर्क

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

तो मैं कुछ इसी तरह पैटर्न में मानक पैटर्न पहचान करने के लिए प्रयास करें। जब न्यूरॉन्स के राज्य बदल रहा बंद प्रक्रिया बंद कर दिया जाना चाहिए या जब सीमा (65535 पुनरावृत्तियों) दूर है:

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

} 

मान्यता प्रक्रिया बंद हो जाता है केवल जब सीमा पारित कर दिया है:

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 एक सक्रियण कार्य है। और बाहर पैटर्न मानक पैटर्न की तरह दिखता नहीं है। कृपया गलती खोजने में मदद करें। अग्रिम धन्यवाद।

पीएस समस्या सुलझ गई है।

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

ध्यान के लिए धन्यवाद: मुख्य गलती है कि मैं चक्र की शुरुआत में शून्य 'शुद्ध' चर करने के लिए सेट करना भूल गया था।

+0

मैंने सोचा था कि जावा पहले से ही 'Math.signum (एक्स)' के दोहरे और नाव इनपुट के लिए विधि एक्स? आपका संस्करण पर ध्यान नहीं देता शून्य (0) यदि एक्स = 0. लिंक http://en.wikipedia.org/wiki/Signum_function –

+0

मेरे संस्करण की अनदेखी नहीं है x = 0 देखें। जब x = 0, साइनम (x) = - 1। पैटर्न वेक्टर में केवल "1" या "-1" मान हो सकते हैं। – user1020946

+0

किसी भी मौके से आप हिनटन के तंत्रिका नेटवर्क कोर्स में हैं? – Nayuki

उत्तर

3

मुख्य गलती है कि मैं चक्र की शुरुआत में शून्य 'शुद्ध' चर करने के लिए सेट करना भूल गया था:

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]; 
     ... 
    } 
} 
संबंधित मुद्दे