2012-04-25 15 views
5

jest funkcja podobna do: y = sin (x) Chcę używać sieci PyBrain, aby dopasować funkcje, oto co zrobiłem: po uruchomieniu otrzymasz to, co dostanę, uzyskane dane są daleko z tego, co powinno być.Jak dopasować funkcję za pomocą sieci 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

Jakie jest twoje pytanie? Czy próbowałeś innych architektur sieciowych niż ten 5-warstwowy przykład? – schaul

Odpowiedz

8

Przypuszczam, że problem polega na tym, że ta sieć nie pasuje do tej funkcji. Całkowita liczba węzłów sieci jest zbyt niska, aby odpowiednio pasować do tej funkcji sin (x): funkcja jest zbyt złożona. Ponadto, aby dopasować dowolną funkcję, wymagana jest zasadniczo nie więcej niż jedna ukryta warstwa.

Na przykład spróbuj usunąć dwie ukryte warstwy i zwiększyć liczbę ukrytych węzłów (na przykład 20). Twój kod pasuje do funkcji dokładnie wtedy,

Powiązane problemy