2015-09-18 14 views
6

podstawie PyBrain's tutorials udało mi się wbić razem następujący kod:Jak utworzyć prostą, trójwarstwową sieć neuronową i nauczać ją za pomocą nadzorowanego uczenia?

#!/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] 

to miało nauczyć funkcji XOR, ale wyniki wydają się zupełnie przypadkowo:

0,208884929522

0.168926515771

0.459452834043

0,424209192223

lub

0,84956138664

0,888512762786

0,564964077401

0,611111147862

Odpowiedz

8

re są cztery problemy z podejściem, wszystko łatwo zidentyfikować po przeczytaniu Neural Network FAQ:

  • Why use a bias/threshold?: należy dodać węzeł stronniczości. Brak uprzedzeń powoduje, że nauka jest bardzo ograniczona: hiperpłaszczyzna oddzielająca reprezentowana przez sieć może jedynie przechodzić przez pochodzenie. Z węzłem polaryzacji, może się swobodnie poruszać i dopasować dane lepsze:

    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?: wszystkie próbki leżała w jednej ćwiartce powierzchni próbki. Przenieś je do rozrzucone wokół pochodzenia:

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

    (Fix kod weryfikacyjny na końcu skryptu odpowiednio.)

  • trainUntilConvergence metoda działa za pomocą walidacji, i robi coś, co przypomina early stopping method . To nie ma sensu dla tak małego zbioru danych. Zamiast tego użyj trainEpochs. 1000 epok jest więcej niż wystarczająco dla tego problemu dla sieci do nauki:

    trainer.trainEpochs(1000) 
    
  • What learning rate should be used for backprop?: Tune parametr szybkość uczenia się. To jest coś, co robisz za każdym razem, gdy używasz sieci neuronowej. W tym przypadku wartość 0.1 lub nawet 0.2 dramatycznie zwiększa szybkość uczenia się:

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

    (Uwaga parametr verbose=True Obserwując w jaki sposób zachowuje się błąd jest niezbędna, gdy parametry strojenia..)

Z tych poprawek, które uzyskuję spójny i poprawnych wyników dla danej sieci z danego zestawu danych, a błędem mniejszym niż 1e-23.

+0

Czy istnieje metoda szkolenia sieci, dopóki średni błąd nie jest mniejszy (lub równy) niż wymagany lub nie osiągnięto limitu liczby epok? – Luke

+0

Dokumentacja @Luke PyBrain uczciwie stwierdza, że ​​"Ta dokumentacja zawiera tylko subiektywny fragment dostępnych metod". Musisz więc przyjrzeć się implementacji swojej konkretnej dystrybucji PyBrain. Ale nawet jeśli nie jest, bardzo łatwo jest wdrożyć taką pętlę samodzielnie. – BartoszKP

Powiązane problemy