2015-12-16 21 views
6

Sto cercando di implementare un classificatore semplice per il problema XOR in Keras. Ecco il codice:Impossibile addestrare una rete neurale per risolvere il mapping XOR

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]]))) 

Ho provato a cambiare il numero di epoche, il tasso di apprendimento e altri parametri. Ma l'errore rimane costante dalla prima all'ultima epoca.

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

Come si allena questa rete in Keras?

Inoltre, esiste una libreria migliore per l'implementazione delle reti neurali? Ho provato PyBrain, ma è stato abbandonato, provato scikit-neuralnetwork ma la documentazione è davvero criptica, quindi non ho potuto capire come addestrarlo. E dubito seriamente che anche Keras funzioni.

risposta

5

Nel tuo esempio, si ha un denso strato di 1 unità con un'attivazione softmax. Il valore di tale unità sarà sempre 1.0, quindi nessuna informazione può fluire dagli ingressi alle uscite e la rete non farà nulla. Softmax è utile solo quando è necessario generare una previsione di una probabilità tra n classi, dove n è maggiore di 2.

Le altre risposte suggeriscono modifiche al codice per farlo funzionare. Basta rimuovere activation='softmax' potrebbe essere sufficiente.

Keras generalmente funziona.

0

Provare l'ultimo perceptron nella rete senza una funzione di attivazione. Ho avuto lo stesso problema e inizia a imparare quando si rimuove la funzione di attivazione.

Inoltre, è possibile provare a suddividere lo strato di output in 2 neuroni. E avere l'uscita essere [0,1] per 0 e [1,0] per uno.

Tuttavia, la rimozione della funzione di attivazione dovrebbe fare il trucco.

0

Questo codice funziona per me:

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] 

Purtroppo, io sono principianti nell'apprendimento della macchina e non so il motivo per cui il mio codice funziona e il vostro non lo fa.

I used this code.

Problemi correlati