Я пытаюсь реализовать простой классификатор для проблемы 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.]]

Как вы тренируете эту сеть в Керасе?

Кроме того, есть ли лучшая библиотека для реализации нейронных сетей? Я попробовал PyBrain, но он был заброшен, попробовал scikit-neuralnetwork, но документация действительно загадочная, поэтому я не мог понять, как ее обучить. И я серьезно сомневаюсь, работает ли Керас.

6
Aditya Shinde 16 Дек 2015 в 15:05

3 ответа

Лучший ответ

В вашем примере у вас есть плотный слой с 1 юнитом с активацией softmax. Значение такого устройства всегда будет равно 1,0, поэтому никакая информация не может перетекать с ваших входов на ваши выходы, и сеть ничего не сделает. Softmax действительно полезен только тогда, когда вам нужно сгенерировать прогноз вероятности среди n классов, где n больше 2.

Другие ответы предполагают изменения в коде, чтобы заставить его работать. Простого удаления activation='softmax' может быть достаточно.

Керас вообще работает.

5
JeremyR 31 Мар 2016 в 10:17

У меня работает этот код:

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]

К сожалению, я новичок в машинном обучении и не знаю, почему мой код работает, а ваш нет.

Я использовал этот код.

0
Dawid Loranc 24 Фев 2016 в 23:58

Попробуйте последний персептрон в сети без функции активации. У меня была такая же проблема, и она начинает учиться, когда вы удаляете функцию активации.

Также вы можете попытаться разделить выходной слой на 2 нейрона. И иметь выходное значение [0,1] для 0 и [1,0] для одного.

Однако удаление функции активации должно помочь.

0
Mikhail Kashtaev 11 Янв 2016 в 10:19