2017-11-02 2 views
0

Ich folgte nur einem tutorial für ein einfaches neuronales Netzwerk. Es hat mir wirklich geholfen, das Konzept zu verstehen. Aber wenn ich es nur mit Nullen teste, also [0,0,0], gibt es 0,5 anstelle von 0 zurück. Warum macht es das? Was muss dafür geändert werden, um ~ 0 zurückzugeben?Neuronales Netzwerk gibt 0,5 statt 0 zurück

X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ]) 
y = np.array([[0,1,1,0]]).T 
syn0 = 2*np.random.random((3,4)) - 1 
syn1 = 2*np.random.random((4,1)) - 1 
for j in xrange(60000): 
    l1 = 1/(1+np.exp(-(np.dot(X,syn0)))) 
    l2 = 1/(1+np.exp(-(np.dot(l1,syn1)))) 
    l2_delta = (y - l2)*(l2*(1-l2)) 
    l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1)) 
    syn1 += l1.T.dot(l2_delta) 
    syn0 += X.T.dot(l1_delta) 

Danke und Grüße

Antwort

0

Die logistic function einen Wert von 0.5 am Ursprung hat. Wenn Sie möchten, dass Ihre Übertragungsfunktion am Ursprung 0 ist, verwenden Sie tanh (Sie müssten jedoch Ihre Ableitung ändern).

+0

Aber dann würde mein neuronales Netzwerk -1 für falsch und 1 für wahr zurückgeben, nicht wahr? Also würde ich immer noch ein falsches Ergebnis bekommen. Ist meine Art zu denken falsch, oder würde ein Multi-Layer-Netzwerk das Problem beheben, da [0,0,0] nichts an beiden Funktionen ändert. – fritter

+0

Für XOR müssen Sie normalerweise die Ergebnisse in einer bestimmten Weise interpretieren. Zum Beispiel interpretieren Sie mit der logistischen Funktion Werte '> 0.5 'als' 1 'und Werte' <= 0.5 'als' 0 '. Die logistischen und tanh Funktionen sind asymptotisch und würden dir niemals "1" geben. Man könnte argumentieren, dass mit der begrenzten Genauigkeit von "double" die Funktion letztendlich eine effektive "0" oder "1" erzeugen würde, aber das ist ein bisschen hackisch. – cantordust

+0

Also funktioniert das Skript richtig? Da alles <= 0,5 bedeutet 0, [0,0,0] war richtig. Ich war nur verwirrt, weil andere Ergebnisse zum Beispiel 0.oder 0.998 waren. – fritter