Sto provando a fare la regressione più semplice su pyBrain ma in qualche modo sto fallendo.Esempio di regressione semplice pyBrain
Il Neural Network dovrebbe imparare la funzione Y = 3 * X
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet
from pybrain.structure import FullConnection, FeedForwardNetwork, TanhLayer, LinearLayer, BiasUnit
import matplotlib.pyplot as plt
from numpy import *
n = FeedForwardNetwork()
n.addInputModule(LinearLayer(1, name = 'in'))
n.addInputModule(BiasUnit(name = 'bias'))
n.addModule(TanhLayer(1,name = 'tan'))
n.addOutputModule(LinearLayer(1, name = 'out'))
n.addConnection(FullConnection(n['bias'], n['tan']))
n.addConnection(FullConnection(n['in'], n['tan']))
n.addConnection(FullConnection(n['tan'], n['out']))
n.sortModules()
# initialize the backprop trainer and train
t = BackpropTrainer(n, learningrate = 0.1, momentum = 0.0, verbose = True)
#DATASET
DS = SupervisedDataSet(1, 1)
X = random.rand(100,1)*100
Y = X*3+random.rand(100,1)*5
for r in xrange(X.shape[0]):
DS.appendLinked((X[r]),(Y[r]))
t.trainOnDataset(DS, 200)
plt.plot(X,Y,'.b')
X=[[i] for i in arange(0,100,0.1)]
Y=map(n.activate,X)
plt.plot(X,Y,'-g')
E non impara nulla. Ho provato a rimuovere il livello nascosto (perché in questo esempio non ne abbiamo nemmeno bisogno) e la rete ha iniziato a prevedere i NaN. Cosa sta succedendo?
EDIT: Questo è il codice che ha risolto il mio problema:
#DATASET
DS = SupervisedDataSet(1, 1)
X = random.rand(100,1)*100
Y = X*3+random.rand(100,1)*5
maxy = float(max(Y))
maxx = 100.0
for r in xrange(X.shape[0]):
DS.appendLinked((X[r]/maxx),(Y[r]/maxy))
t.trainOnDataset(DS, 200)
plt.plot(X,Y,'.b')
X=[[i] for i in arange(0,100,0.1)]
Y=map(lambda x: n.activate(array(x)/maxx)*maxy,X)
plt.plot(X,Y,'-g')
Ho anche dovuto dividere l'input per il suo massimo (100). Quando inizio l'allenamento i neuroni emettono valori superiori a 1 e inferiori a 0 .. non capisco come funzioni .. –
Non ho sondato l'interno di pybrain per verificare come funziona, ma è comunque un buon pratica generale per ridimensionare i tuoi input, in modo che quando hai più input (che, scontato, non hai qui, ma in altri casi lo farai) iniziano a pesare sullo stesso. – rossdavidh