2015-07-22 5 views
4

Je veux pratiquer keras par code a xor, mais le résultat n'est pas juste, le suivi est mon code, merci pour tout le monde de m'aider.Comment utiliser keras pour XOR

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 

Sortie

[[ 0.31851079] [ 0.34130159]] [[ 0.49635666] [0.51274764]] 
+0

Que signifie "pas correct"? Quel résultat obtenez-vous? Qu'attendez-vous? – Daniel

+0

merci, je veux obtenir la liste classes = [a, b], une approche à 1, b approche à 0, mais la vérité est que a, b comme un aléatoire, il y a deux résultats: [[0.31851079] [0.34130159]] [[0.49635666] [0.51274764]] –

+0

Veuillez intégrer cela dans votre question. De cette façon, nous n'avons pas besoin de reproduire votre exercice pour savoir ce qui ne va pas ... – Daniel

Répondre

1

Si j'augmente le nombre d'époques dans votre code pour qu'il ne converge 50000 souvent à la bonne réponse pour moi, prend juste un peu de temps :)

Cela reste souvent bloqué. J'obtiens de meilleures propriétés de convergence si je change votre fonction de perte en 'mean_squared_error', qui est une fonction plus lisse.

Je reçois toujours plus de convergence si j'utilise les optimisateurs Adam ou RMSProp. Ma ligne de compilation finale, qui fonctionne:

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

4 hyper paramètre est en train d'être ajusté à 4 (point de données, étiquettes). Un opérateur XOR n'est pas appris, il est sur-équipé. –

+0

Oui, c'est correct @ J.Down – Aditya

0

J'ai utilisé une seule couche cachée avec 4 nœuds cachés, et il converge presque toujours la bonne réponse à 500 époques. J'ai utilisé des activations sigmoïdes.

+0

Ce serait trop surfait? –