2017-06-19 6 views
0

Ich habe dieses einfache Modell implementiert, um neuronale Netze zu lernen, es trainiert gut und gibt die Ausgabe, die ursprünglich gegeben wurde.Python einfache neurale Vorwärtsnetz XOR-Funktion

Das ist, wo ich irgendwie Verlust bin, im Beispiel der XOR-Funktionserkennung möchte ich nur testen können, nicht trainieren. Es scheint so, als ob alle Online-Lesungen ganz auf Training abzielen und dann genau dort aufhören.

Bedeutet dies, dass das Modell für jede neue Eingabe das ganze Set neu berechnen und trainieren muss? Hat es etwas mit den Gewichten zu tun? Wie würden Sie damit fortfahren, das Modell "live" laufen zu lassen und neue Inputs als Teil seines Live-Feedbacks und des laufenden Wiederholungstrainings zu nehmen?

Dank

import numpy as np 

def nonlin(x, deriv=False): 
    if(deriv==True): 
     return x*(1-x) 

    return 1/(1+np.exp(-x)) 

#4x2 
x = np.array([[0,0],[0,1],[1,0],[1,1]]) 
print (x) 

#1x4 
y = np.array([[0],[1],[1],[0]]) 

np.random.seed(1) 

syn0 = 2*np.random.random((2,4))-1 
print (syn0) 

syn1 = 2*np.random.random((4,1))-1 

for j in range(60000): 

    l0 = x; 
    l1 = nonlin(np.dot(l0,syn0)) 
    l2 = nonlin(np.dot(l1,syn1)) 

    l2_error = y - l2 

    l2_delta = l2_error*nonlin(l2, deriv=True) 

    l1_error = l2_delta.dot(syn1.T) 

    l1_delta = l1_error * nonlin(l1,deriv=True) 

    syn1 += l1.T.dot(l2_delta) 
    syn0 += l0.T.dot(l1_delta) 

    if(j % 10000) ==0: 
     print ("Error:" + str(np.mean(np.abs(l2_error)))) 

print ("Output after training") 
print (syn0) 
print (syn1) 
print (l2) 
+1

Ich bekomme nicht, was das Problem ist? Sie können das Netzwerk einfach testen, indem Sie eine Eingabe (zum Beispiel (0,1)) eingeben und sehen, was aus dem Netzwerk ausgeht (etwas in der Nähe von 1). –

+1

Vielleicht hilft uns ein Beispielcode/Pseudocode, zu verstehen, was Sie erreichen möchten? – matt2000

+0

Das hört sich vielleicht blöd an, aber genau das kann ich nicht herausfinden ... Sollte ich das vom Netzwerk angegebene Gewicht verwenden, sehe ich nicht, was in der Funktion steckt, die einen Eingang braucht und im Netzwerk testet ? – matel

Antwort

0

Sie müssen nur den Code ausklammern, dass das neuronale Netz Berechnung tatsächlich der Fall ist, hier ist der Code geändert auf diese Weise:

import numpy as np 

def nonlin(x, deriv=False): 
    if(deriv==True): 
     return x*(1-x) 

    return 1/(1+np.exp(-x)) 


#4x2 
x = np.array([[0,0],[0,1],[1,0],[1,1]]) 
print ("x=",x) 

#1x4 
y = np.array([[0],[1],[1],[0]]) 
print ("y=",y) 

np.random.seed(1) 

syn0 = 2*np.random.random((2,4))-1 
print (syn0) 

syn1 = 2*np.random.random((4,1))-1 

def NN(x): 
    l0 = x; 
    l1 = nonlin(np.dot(l0,syn0)) 
    l2 = nonlin(np.dot(l1,syn1)) 
    return (l0,l1,l2) 

for j in range(60000): 

    l0,l1,l2 = NN(x) 

    l2_error = y - l2 

    l2_delta = l2_error*nonlin(l2, deriv=True) 

    l1_error = l2_delta.dot(syn1.T) 

    l1_delta = l1_error * nonlin(l1,deriv=True) 

    syn1 += l1.T.dot(l2_delta) 
    syn0 += l0.T.dot(l1_delta) 

    if(j % 10000) ==0: 
     print ("Error:" + str(np.mean(np.abs(l2_error)))) 

print ("Output after training") 
print ("trained l0 weights:",syn0) 
print ("trained l1 weights:",syn1) 
l0,l1,l2 = NN(x) 
print ("NN(",x,") == ",l2) 

Hier NN (x) ist die Funktion, die die Berechnung des neuronalen Netzes durchführt. Es gibt Werte für den Eingabevektor, die ausgeblendete Ebene und die Ausgabeebene in einem Tupel zurück. Sie können eine separate Funktion für sauberere Schnittstelle codieren: