Cómo usar keras para XOR

Quiero practicar keras por código a xor, pero el resultado no es correcto, lo que sigue es mi código, gracias a todos por ayudarme.

from keras.models import Sequential from keras.layers.core import Dense,Activation from keras.optimizers import SGD import numpy as np model = Sequential()# two layers model.add(Dense(input_dim=2,output_dim=4,init="glorot_uniform")) model.add(Activation("sigmoid")) model.add(Dense(input_dim=4,output_dim=1,init="glorot_uniform")) model.add(Activation("sigmoid")) sgd = SGD(l2=0.0,lr=0.05, decay=1e-6, momentum=0.11, nesterov=True) model.compile(loss='mean_absolute_error', optimizer=sgd) print "begin to train" list1 = [1,1] label1 = [0] list2 = [1,0] label2 = [1] list3 = [0,0] label3 = [0] list4 = [0,1] label4 = [1] train_data = np.array((list1,list2,list3,list4)) #four samples for epoch = 1000 label = np.array((label1,label2,label3,label4)) model.fit(train_data,label,nb_epoch = 1000,batch_size = 4,verbose = 1,shuffle=True,show_accuracy = True) list_test = [0,1] test = np.array((list_test,list1)) classes = model.predict(test) print classes 

Salida

 [[ 0.31851079] [ 0.34130159]] [[ 0.49635666] [0.51274764]] 

Si incremento el número de épocas en su código a 50000, a menudo converge a la respuesta correcta para mí, solo toma un poco de tiempo 🙂

Aunque a menudo se atasca. Obtengo mejores propiedades de convergencia si cambio su función de pérdida a ‘mean_squared_error’, que es una función más suave.

Obtengo una convergencia aún más rápida si utilizo los optimizadores Adam o RMSProp. Mi última línea de comstackción, que funciona:

 model.compile(loss='mse', optimizer='adam') ... model.fit(train_data, label, nb_epoch = 10000,batch_size = 4,verbose = 1,shuffle=True,show_accuracy = True) 

Utilicé una sola capa oculta con 4 nodos ocultos, y casi siempre converge en la respuesta correcta dentro de las 500 épocas. Utilicé activaciones sigmoideas.