5

次のような関数があります: y = sin(x) 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()
4

1 に答える 1

8

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

たとえば、2 つの非表示レイヤーを削除して、非表示ノードの数を (たとえば 20 に) 増やしてみてください。あなたのコードは関数にうまく適合します

于 2012-09-27T12:17:40.637 に答える