não pode treinar uma rede neural resolver mapeamento XOR

votos
6

Eu estou tentando implementar um classificador simples para o problema XOR em Keras. Aqui está o código:

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

Eu tentei mudar o número de épocas, taxa de aprendizagem, e outros parâmetros. Mas o erro permanece constante desde o primeiro até o último época.

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

Como você treina esta rede em Keras?

Além disso, há uma melhor biblioteca para implementação de redes neurais? Tentei PyBrain, mas ele foi abandonado, tentou scikit-rede neural mas a documentação é realmente enigmático por isso não poderia descobrir como treiná-lo. E eu duvido seriamente se Keras funciona mesmo.

Publicado 16/12/2015 em 10:05
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

Experimente o último perceptron na rede sem uma função de ativação. Eu tive o mesmo problema e ele começa a aprender quando você remover a função de ativação.

Além disso, você pode tentar dividir a camada de saída em 2 neurônios. E ter a saída ser [0,1] para 0 e [1,0] para um.

No entanto, remover a função de ativação deve fazer o truque.

Respondeu 11/01/2016 em 08:19
fonte usuário

votos
0

Esse código funciona para mim:

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]

Infelizmente, eu sou iniciante na aprendizagem de máquina e eu não sei por que meu código funciona e você não faz.

Eu usei esse código.

Respondeu 24/02/2016 em 21:58
fonte usuário

votos
5

No seu exemplo, você tem uma camada densa com 1 unidade com um ativação softmax. O valor de uma tal unidade será sempre 1.0, portanto nenhuma informação pode fluir de suas entradas para as suas saídas, ea rede não vai fazer nada. Softmax só é realmente útil quando você precisa para gerar uma previsão de uma probabilidade entre n classes, onde n é maior do que 2.

As outras respostas sugerem alterações no código para fazer o trabalho. Apenas a remoção activation='softmax'pode ser suficiente.

não Keras geralmente trabalham.

Respondeu 31/03/2016 em 09:17
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more