2015-09-18 2 views
6

на основе PyBrain's tutorials мне удалось сколотить следующий код:Как создать простую 3-слойную нейронную сеть и научить ее с помощью контролируемого обучения?

#!/usr/bin/env python2 
# coding: utf-8 

from pybrain.structure import FeedForwardNetwork, LinearLayer, SigmoidLayer, FullConnection 
from pybrain.datasets import SupervisedDataSet 
from pybrain.supervised.trainers import BackpropTrainer 

n = FeedForwardNetwork() 

inLayer = LinearLayer(2) 
hiddenLayer = SigmoidLayer(3) 
outLayer = LinearLayer(1) 

n.addInputModule(inLayer) 
n.addModule(hiddenLayer) 
n.addOutputModule(outLayer) 

in_to_hidden = FullConnection(inLayer, hiddenLayer) 
hidden_to_out = FullConnection(hiddenLayer, outLayer) 

n.addConnection(in_to_hidden) 
n.addConnection(hidden_to_out) 

n.sortModules() 

ds = SupervisedDataSet(2, 1) 
ds.addSample((0, 0), (0,)) 
ds.addSample((0, 1), (1,)) 
ds.addSample((1, 0), (1,)) 
ds.addSample((1, 1), (0,)) 

trainer = BackpropTrainer(n, ds) 
# trainer.train() 
trainer.trainUntilConvergence() 

print n.activate([0, 0])[0] 
print n.activate([0, 1])[0] 
print n.activate([1, 0])[0] 
print n.activate([1, 1])[0] 

Он должен узнать функцию XOR, но результаты кажутся совершенно случайно:

0,208884929522

0.168926515771

0,459452834043

0,424209192223

или

0,84956138664

0,888512762786

0,564964077401

0,611111147862

ответ

8

ре четыре проблемы с вашим подходом, все легко определить после прочтения Neural Network FAQ:

  • Why use a bias/threshold?: Вы должны добавить узел смещения. Отсутствие предвзятости делает обучение очень ограниченным: разделительная гиперплоскость, представленная сетью, может проходить только через начало координат. С узлом смещения, он может свободно передвигаться и лучше подходит данным:

    bias = BiasUnit() 
    n.addModule(bias) 
    
    bias_to_hidden = FullConnection(bias, hiddenLayer) 
    n.addConnection(bias_to_hidden) 
    
  • Why not code binary inputs as 0 and 1?: все ваши образцы лежали в одном квадранте выборочного пространства. Сдвинуть их быть разбросаны по всему происхождению:

    ds = SupervisedDataSet(2, 1) 
    ds.addSample((-1, -1), (0,)) 
    ds.addSample((-1, 1), (1,)) 
    ds.addSample((1, -1), (1,)) 
    ds.addSample((1, 1), (0,)) 
    

    (Фикс проверочного кода в конце вашего скрипта, соответственно.)

  • trainUntilConvergence метод работает с использованием проверки, и делает что-то, что напоминает early stopping method , Это не имеет смысла для такого небольшого набора данных. Вместо этого используйте trainEpochs. 1000 эпохи более чем достаточно для этой задачи для сети, чтобы узнать:

    trainer.trainEpochs(1000) 
    
  • What learning rate should be used for backprop?: Настройте параметр скорости обучения. Это то, что вы делаете каждый раз, когда используете нейронную сеть. В этом случае значение 0.1 или даже 0.2 резко повышает скорость обучения:

    trainer = BackpropTrainer(n, dataset=ds, learningrate=0.1, verbose=True) 
    

    (Обратите внимание на параметр verbose=True Наблюдая, как ошибка ведет себя важно, когда параметры настройки..)

С помощью этих исправлений я получаю последовательный и правильные результаты для данной сети с заданным набором данных, и ошибок меньше, чем 1e-23.

+0

Существует ли какой-либо метод для обучения сети до тех пор, пока средняя ошибка не будет ниже (или равна), чем требуется, или был достигнут предел для числа эпох? – Luke

+0

Документация @Luke PyBrain честно заявляет, что «эта документация содержит только субъективную выдержку доступных методов». Поэтому вам нужно будет изучить реализацию вашего конкретного дистрибутива PyBrain. Но даже если этого не происходит, очень легко реализовать такой цикл самостоятельно. – BartoszKP

Смежные вопросы