2012-04-25 7 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

答えて

8

あなたの問題は、このネットワークが機能にうまく適合しないことです。ネットワークノードの総数がこのsin(x)関数に適切に適合するには低すぎます。関数が複雑すぎます。また、任意の関数をフィットさせるために、原則として複数の隠れ層が必要とされることはない。

たとえば、2つの隠れたレイヤーを削除し、隠れたノードの数を増やしてみてください(たとえば、20)。あなたのコードはちょうど良い機能を適合します

関連する問題