2015-09-18 16 views
6

Sulla base PyBrain's tutorials sono riuscito a mettere insieme il seguente codice:Come creare una semplice rete neurale a 3 strati e insegnarla usando l'apprendimento supervisionato?

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

Dovrebbe imparare funzione XOR, ma i risultati sembrano abbastanza casuale:

0,208884929522

0,168926515771

0.459452834043

0,424209192223

o

0,84956138664

0,888512762786

0,564964077401

0,611111147862

risposta

8

L' re sono quattro problemi con il vostro approccio, tutti facili da identificare, dopo aver letto Neural Network FAQ:

  • Why use a bias/threshold?: si dovrebbe aggiungere un nodo bias. La mancanza di pregiudizi rende l'apprendimento molto limitato: l'iperpiano di separazione rappresentato dalla rete può solo passare attraverso l'origine. Con il nodo di polarizzazione, può muoversi liberamente e adattarsi ai dati meglio:

    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?: tutti i campioni giacevano in un singolo quadrante dello spazio campionario. Spostarli essere sparsi intorno all'origine:

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

    (Fissare il codice di convalida al termine dello script di conseguenza.)

  • trainUntilConvergence metodo funziona con la convalida, e fa qualcosa che assomiglia alla early stopping method . Questo non ha senso per un set di dati così piccolo. Utilizzare invece trainEpochs. 1000 epoche è più che sufficiente per questo problema per la rete di imparare:

    trainer.trainEpochs(1000) 
    
  • What learning rate should be used for backprop?: Tune il parametro tasso di apprendimento. Questo è qualcosa che fai ogni volta che usi una rete neurale. In questo caso, il valore 0.1 o anche 0.2 aumenta notevolmente la velocità di apprendimento:

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

    (Si noti il ​​parametro verbose=True Osservando come si comporta l'errore è essenziale quando parametri di ottimizzazione..)

Con queste correzioni ottengo costante e risultati corretti per la rete di data con il dato insieme di dati, e l'errore meno di 1e-23.

+0

Esiste un metodo per addestrare la rete finché l'errore medio non è inferiore (o uguale) del necessario o è stato raggiunto il limite per il numero di epoche? – Luke

+0

La documentazione di @Luke PyBrain afferma onestamente che "questa documentazione comprende solo un estratto soggettivo dei metodi disponibili". Quindi avrai bisogno di esaminare l'implementazione della tua particolare distribuzione PyBrain. Ma anche se non c'è, è molto facile implementare tale ciclo da solo. – BartoszKP

Problemi correlati