5

pyBrain에서 가장 단순한 회귀를 시도하지만 어떻게 든 실패합니다.간단한 회귀 예 pyBrain

신경망 함수 Y를 배워야한다 = 3 * X

from pybrain.supervised.trainers import BackpropTrainer 
from pybrain.datasets import SupervisedDataSet 
from pybrain.structure import FullConnection, FeedForwardNetwork, TanhLayer, LinearLayer, BiasUnit 
import matplotlib.pyplot as plt 
from numpy import * 

n = FeedForwardNetwork() 
n.addInputModule(LinearLayer(1, name = 'in')) 
n.addInputModule(BiasUnit(name = 'bias')) 
n.addModule(TanhLayer(1,name = 'tan')) 
n.addOutputModule(LinearLayer(1, name = 'out')) 
n.addConnection(FullConnection(n['bias'], n['tan'])) 
n.addConnection(FullConnection(n['in'], n['tan'])) 
n.addConnection(FullConnection(n['tan'], n['out'])) 
n.sortModules() 

# initialize the backprop trainer and train 
t = BackpropTrainer(n, learningrate = 0.1, momentum = 0.0, verbose = True) 

#DATASET 
DS = SupervisedDataSet(1, 1) 
X = random.rand(100,1)*100 
Y = X*3+random.rand(100,1)*5 
for r in xrange(X.shape[0]): 
    DS.appendLinked((X[r]),(Y[r])) 

t.trainOnDataset(DS, 200) 
plt.plot(X,Y,'.b') 
X=[[i] for i in arange(0,100,0.1)] 
Y=map(n.activate,X) 
plt.plot(X,Y,'-g') 

그것은 아무것도 알 수 없습니다. 숨겨진 레이어를 제거하려고 시도 했으므로 (이 예제에서는 필요 없기 때문에) 네트워크가 NaN을 예측하기 시작했습니다. 무슨 일 이니?

편집 : 이것은 내 문제 해결 코드입니다 :

#DATASET 
DS = SupervisedDataSet(1, 1) 
X = random.rand(100,1)*100 
Y = X*3+random.rand(100,1)*5 
maxy = float(max(Y)) 
maxx = 100.0 
for r in xrange(X.shape[0]): 
    DS.appendLinked((X[r]/maxx),(Y[r]/maxy)) 

t.trainOnDataset(DS, 200) 

plt.plot(X,Y,'.b') 
X=[[i] for i in arange(0,100,0.1)] 
Y=map(lambda x: n.activate(array(x)/maxx)*maxy,X) 
plt.plot(X,Y,'-g') 

답변

4

기본 pybrain의 뉴런 (300)에 의해 0과 1 나누기 사이에 출력 뭔가 (가능한 최대 값) 당신의 Y를 예정을하고 더 나은 결과를 얻을 수 있습니다.

보다 일반적으로 데이터 집합의 최대 Y를 찾아서 모든 것을 확장합니다.

+0

입력을 최대 (100)로 나누어야했습니다. 내가 훈련을 시작할 때 뉴런은 1보다 큰 값을 출력하고 0보다 낮은 값을 출력합니다.이게 어떻게 작동하는지 이해하지 못합니다 .. –

+0

파이브레인의 내부 구조를 꼼꼼히 살펴보고 작동 여부를 확인하지는 못했지만 어떤 경우에도 좋은 결과를 얻었습니다 입력을 확장하는 일반적인 방법은 여러 입력을 가질 때 (여기에는 부여하지 않지만 다른 경우에는 그렇게 할 것입니다)에 대해 가중치가 동일하게 시작됩니다. – rossdavidh