2012-04-25 40 views
5

有一個函數,如: y = sin(x) 我想使用PyBrain網絡來適應函數,這裏是我所做的:當你運行它時你會得到我所得到的數據,從應該是什麼。如何適合使用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

那麼你的問題是什麼?您是否嘗試過其他網絡架構而不是這個5層深的示例? – schaul 2012-08-07 04:10:38

回答

8

我想你的問題是這個網絡不適合這個功能。網絡節點的總數太低,無法正確適應這個sin(x)函數:函數太複雜。另外,爲了擬合任何功能,原則上不需要多於一個隱藏層。

例如,嘗試刪除兩個隱藏層,並增加隱藏節點的數量(例如20)。你的代碼適合這個功能就好了