2015-12-16 6 views
6

Ich versuche, einen einfachen Klassifikator für das XOR-Problem in Keras zu implementieren. Hier ist der Code:Ich kann kein neuronales Netzwerk trainieren, das XOR-Mapping löst

from keras.models import Sequential 
from keras.layers.core import Dense, Dropout, Activation 
from keras.optimizers import SGD 
import numpy 

X = numpy.array([[1., 1.], [0., 0.], [1., 0.], [0., 1.], [1., 1.], [0., 0.]]) 
y = numpy.array([[0.], [0.], [1.], [1.], [0.], [0.]]) 
model = Sequential() 
model.add(Dense(2, input_dim=2, init='uniform', activation='sigmoid')) 
model.add(Dense(3, init='uniform', activation='sigmoid')) 
model.add(Dense(1, init='uniform', activation='softmax')) 
sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='mean_squared_error', optimizer=sgd) 

model.fit(X, y, nb_epoch=20) 
print() 
score = model.evaluate(X, y) 
print() 
print(score) 
print(model.predict(numpy.array([[1, 0]]))) 
print(model.predict(numpy.array([[0, 0]]))) 

Ich versuchte, die Anzahl der Epochen, Lernrate und andere Parameter zu ändern. Aber der Fehler bleibt von der ersten bis zur letzten Epoche konstant.

Epoch 13/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 14/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 15/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 16/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 17/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 18/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 19/20 
6/6 [==============================] - 0s - loss: 0.6667 
Epoch 20/20 
6/6 [==============================] - 0s - loss: 0.6667 

6/6 [==============================] - 0s 

0.666666686535 
[[ 1.]] 
[[ 1.]] 

Wie trainierst du dieses Netzwerk in Keras?

Gibt es auch eine bessere Bibliothek für die Implementierung neuronaler Netze? Ich habe versucht, PyBrain, aber es wurde aufgegeben, versuchte scikit-neuralnetwork, aber die Dokumentation ist wirklich kryptisch, so konnte nicht herausfinden, wie man es ausbildet. Und ich bezweifle ernsthaft, ob Keras überhaupt funktioniert.

Antwort

5

In Ihrem Beispiel haben Sie eine dichte Schicht mit 1 Einheit mit einer softmax Aktivierung. Der Wert einer solchen Einheit wird immer 1,0 sein, so dass keine Informationen von Ihren Eingaben zu Ihren Ausgaben fließen können und das Netzwerk nichts tun wird. Softmax ist nur dann wirklich nützlich, wenn Sie eine Vorhersage einer Wahrscheinlichkeit unter n Klassen generieren müssen, wobei n größer als 2 ist.

Die anderen Antworten schlagen Änderungen am Code vor, damit es funktioniert. Das Entfernen von activation='softmax' kann ausreichen.

Keras funktioniert im Allgemeinen.

0

Versuchen Sie das letzte Perzeptron im Netzwerk ohne eine Aktivierungsfunktion. Ich hatte das gleiche Problem und es beginnt zu lernen, wenn Sie die Aktivierungsfunktion entfernen.

Sie könnten auch versuchen, die Ausgabeschicht in 2 Neuronen aufzuteilen. Und haben die Ausgabe [0,1] für 0 und [1,0] für eins.

Das Entfernen der Aktivierungsfunktion sollte jedoch den Trick machen.

0

Dieser Code funktioniert für mich:

import numpy as np 
from keras.models import Sequential 
from keras.layers.core import Activation, Dense 
from keras.optimizers import SGD 

X = np.array([[1, 1], [0, 0], [1, 0], [0, 1], [1, 1], [0, 0]], dtype='uint8') 
y = np.array([[0], [0], [1], [1], [0], [0]], dtype='uint8') 


model = Sequential() 
model.add(Dense(2, input_dim=2)) 
model.add(Activation('sigmoid')) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='mean_squared_error', optimizer=sgd, class_mode="binary") 

history = model.fit(X, y, nb_epoch=10000, batch_size=4, show_accuracy=True) 

print 
score = model.evaluate(X,y) 
print 
print score 
print model.predict(np.array([[1, 0]])) 
print model.predict(np.array([[0, 0]])) 

# X vs y comparison 
print 
predictions = model.predict(X) 
predictions = predictions.T 
predictions = [1 if prediction >= 0.5 else 0 for prediction in predictions[0]] 
print predictions 
print [int(n) for n in y] 

Unfortunatelly, ich bin Anfänger in maschinellem Lernen und ich weiß nicht, warum mein Code funktioniert und Sie nicht.

I used this code.

Verwandte Themen