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. Что происходит?

EDIT: Это код, который решить мою проблему:

#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 собираются выводить что-то между 0 и 1. Разделите Y на 300 (максимально возможное значение), и получат лучшие результаты.

В целом, найдите максимальное значение Y для вашего набора данных и масштабируйте все это.

+0

Мне также пришлось разделить вход на максимум (100). Когда я начинаю обучение, нейроны выводят значения выше 1 и ниже 0 .. Я не понимаю, как это работает. –

+0

Я не возился во внутренностях пирамида, чтобы проверить, как это работает, но это в любом случае хорошее общая практика для масштабирования ваших входов, так что, когда у вас есть несколько входов (которые, предоставленные вами, у вас здесь нет, но в других случаях вы будете), они начинают взвешиваться примерно одинаково. – rossdavidh