2012-04-25 10 views
5

hay una función como: y = sin (x) Quiero usar las redes de PyBrain para ajustar las funciones, esto es lo que hice: cuando lo ejecutes obtendrás lo que obtengo, los datos obtenidos están lejos de lo que debería sercómo ajustar una función usando redes PyBrain?

from pybrain.datasets import SupervisedDataSet 
from pybrain.tools.shortcuts import buildNetwork 
from pybrain.supervised.trainers import BackpropTrainer 
import pickle 
import scipy as sp 
import numpy as np 
import pylab as pl 

x = np.linspace(0, 4*np.pi, 100) 
ds = SupervisedDataSet(1,1) 

for i in x: 
    ds.addSample(i,sin(i)) 
print ds 

n = buildNetwork(ds.indim,3,3,3,ds.outdim,recurrent=True) 
t = BackpropTrainer(n,learningrate=0.01,momentum=0.5,verbose=True) 
t.trainOnDataset(ds,1000) 
t.testOnData(verbose=True) 

fileObject = open('trained_net', 'w') 
pickle.dump(n, fileObject) 
fileObject.close() 

fileObject = open('trained_net','r') 
net = pickle.load(fileObject) 

y = [] 
for i in x: 
    y.append(net.activate(i)) 

pl.plot(x,y) 
pl.plot(x,np.sin(x)) 
pl.show() 
+0

Entonces, ¿cuál es su pregunta? ¿Intentó otras arquitecturas de red que este ejemplo de 5 capas de profundidad? – schaul

Respuesta

8

Supongo que su problema es que esta red no se adapta bien a la función. El número total de nodos de red es demasiado bajo para ajustarse correctamente a esta función sin (x): la función es demasiado compleja. Además, para ajustar cualquier función, no se requiere, en principio, más de una capa oculta.

Por ejemplo, intente eliminar dos capas ocultas y aumente la cantidad de nodos ocultos (por ejemplo, 20). Su código se ajusta a la función muy bien entonces

Cuestiones relacionadas