2014-12-26 2 views
1

У меня есть следующий код:PyBrain: Почему PyBrain NN не учится классифицировать XOR?

from pybrain.datasets import SupervisedDataSet 
from pybrain.supervised.trainers import BackpropTrainer 
from pybrain.tools.shortcuts import buildNetwork 
from pybrain.structure import TanhLayer 

ds = SupervisedDataSet(2, 1) 

ds.addSample((0, 0), (0,)) 
ds.addSample((0, 1), (1,)) 
ds.addSample((1, 0), (1,)) 
ds.addSample((1, 1), (0,)) 

net = buildNetwork(2, 3, 1, bias=True, hiddenclass=TanhLayer) 
trainer = BackpropTrainer(net, ds) 

trainer.trainUntilConvergence() 

print '0,0 : {0}'.format(net.activate([0, 0])) 
print '0,1 : {0}'.format(net.activate([0, 1])) 
print '1,0 : {0}'.format(net.activate([1, 0])) 
print '1,1 : {0}'.format(net.activate([1, 1])) 

Выхода я сходиться всегда к чему-то другому, что XOR. Пример для выхода, который я получил:

0,0 : [ 1.33865922] 
0,1 : [ 0.78127428] 
1,0 : [ 0.8318278] 
1,1 : [ 0.48067] 

ответ

1

Успешное решение проблемы. Совместное решение с вами, так что вы можете также использовать его:

Вместо использования trainer.trainUntilCovergence() я назвал trainer.train() K раз (я использовал K=1000), и он работал

Изменение в моем коде:

#trainer.trainUntilConvergence() 
for i in xrange(1000): 
    trainer.train() 

изменение выхода:

0,0 : [ 0.00347109] 
0,1 : [ 0.99712772] 
1,0 : [ 0.99725655] 
1,1 : [ 0.00121727] 

Обратите внимание, что, когда я не достаточно итераций (например, 100), я получил неправильно из ставит

Добавление важное внимание @dnth комментарий:

причина trainUntilConvergence() не работают, потому что этот метод будет разделить ваши данные на 75% обучения и проверки 25%. Поскольку у вас есть только 4 выборочных данных по проблеме XOR, 1 данные были вывезены в качестве данных валидации, и обучение проводится только по оставшимся 3 данным. Поэтому решение, найденное в сети бедно, поскольку данные тренировок является неполной для всех случае XOR

(Validation == Тестирование Set)

+2

причины trainUntilConvergence() не работает, потому что этот метод будет разделять ваши данные в 75% обучение и 25% проверки. Поскольку у вас есть только 4 выборочных данных по проблеме XOR, 1 данные были вывезены в качестве данных валидации, и обучение проводится только по оставшимся 3 данным. Поэтому решение, обнаруженное сетью, плохо, потому что данные обучения неполны для всех случаев XOR – dnth

+0

Я этого не знал. В чем смысл «валидации»? Он проверяет, хорошо ли он обучен (например, когда у вас установлен набор тренировок и набор тестов)? Или «валидация» - это еще один шаг, который предпринимается во время обучения нейронной сети? – SomethingSomething

+1

Да, в этом случае проверка является набором тестов, который изолирован во время обучения и используется только для тестирования сети во время обучения. – dnth