无法训练神经网络解决XOR映射

时间:2015-12-16 12:05:03

标签: python neural-network keras

我正在尝试为Keras中的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]])))

我尝试更改时代数,学习率和其他参数。但从第一个时期到最后一个时期,错误仍然保持不变。

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

你如何在Keras训练这个网络?

此外,是否有更好的库来实现神经网络?我试过PyBrain,但它已经被放弃了,尝试了scikit-neuralnetwork,但文档真的很神秘,所以无法弄清楚如何训练它。而且我非常怀疑Keras是否有效。

3 个答案:

答案 0 :(得分:5)

在您的示例中,您有一个带有1个单位且带有softmax激活的Dense图层。这样一个单位的值总是1.0,所以没有信息可以从你的输入流到你的输出,网络也不会做任何事情。只有当您需要在n个类中生成概率预测时,Softmax才真正有用,其中n大于2。

其他答案建议更改代码以使其正常工作。只需删除activation='softmax'即可。

Keras一般都有效。

答案 1 :(得分:0)

在没有激活功能的情况下尝试网络中的最后一个感知器。我有同样的问题,当你删除激活功能时它开始学习。

此外,您可以尝试将输出层拆分为2个神经元。并且输出为[0,1]为0和[1,0]为一。

但是,删除激活功能应该可以解决问题。

答案 2 :(得分:0)

此代码适用于我:

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]

不幸的是,我是机器学习的初学者,我不知道为什么我的代码有效,而你却没有。

I used this code.