9

私はフィードフォワードネットワークで回帰問題を解決する必要があります。私はPyBrainを使用してそれを実行しようとしています。パイブレインの参考文献には回帰の例はないので、代わりに回帰の分類例を適用しようとしましたが、成功しませんでした(分類例はhttp://pybrain.org/docs/tutorial/fnn.htmlです)。以下は私のコードです:pybrainを使用したニューラルネットワークの回帰

この最初の関数は、numpyの配列形式のデータをpybrainのSupervisedDatasetに変換します。 pybrainのリファレンスによれば、問題が回帰のときに使用するデータセットであるため、SupervisedDatasetを使用します。パラメータは、特徴ベクトル(データ)とその期待出力(値)を持つ配列です。

def convertDataNeuralNetwork(data, values): 

fulldata = SupervisedDataSet(data.shape[1], 1) 

for d, v in zip(data, values): 

    fulldata.addSample(d, v)  

return fulldata 

次に、回帰を実行する関数です。私が使用しようとした私は解像度を印刷するとき

regressionTrain = convertDataNeuralNetwork(train_data, train_values) 

regressionTest = convertDataNeuralNetwork(test_data, test_values) 

fnn = FeedForwardNetwork() 

inLayer = LinearLayer(regressionTrain.indim) 
hiddenLayer = LinearLayer(5) 
outLayer = GaussianLayer(regressionTrain.outdim) 

fnn.addInputModule(inLayer) 
fnn.addModule(hiddenLayer) 
fnn.addOutputModule(outLayer) 

in_to_hidden = FullConnection(inLayer, hiddenLayer) 
hidden_to_out = FullConnection(hiddenLayer, outLayer) 

fnn.addConnection(in_to_hidden) 
fnn.addConnection(hidden_to_out) 

fnn.sortModules() 

trainer = BackpropTrainer(fnn, dataset=regressionTrain, momentum=0.1, verbose=True, weightdecay=0.01) 

for i in range(10): 

    trainer.trainEpochs(5) 

    res = trainer.testOnClassData(dataset=regressionTest) 

    print res 

は、すべてのそれの値は0である:train_dataとtrain_valuesは列車の特徴ベクトルとその予想される出力、TEST_DATAとtest_valuesは、テスト特徴ベクトルとその期待出力されていますbuildNetworkはネットワークを構築するためのショートカットとして機能しますが、うまく機能しませんでした。私はまた、隠れたレイヤーで異なる種類のレイヤーと異なる数のノードを試しました。運がありません。

誰かが私が間違っていることを知っていますか?また、いくつかのパイブレーン回帰の例が本当に助けになるでしょう!私は見たときに何も見つけられませんでした。事前に

おかげ

+0

ニューラルネットワークに興味がある場合は、機械学習サイトに参加することを検討してください。http://area51.stackexchange.com/proposals/41738/machine-learning – travisbartley

+2

出力層を線形にしたい回帰---あなたはおそらくS字状/灰色の隠しユニット –

+1

を厳密には必ずしも線形ではないが、出力が '0..1'のような範囲に限定された活性化ではないことを望むでしょう。また、線形の隠れ層の目的が(コードのように)どんなものであるのかよくわからないので、これは通常、次の層の重みに吸収されます。 –

答えて

5

pybrain.tools.neuralnets.NNregression

を数値 オプションのオンライン進捗プロットして、データのセットの目標を予測することは学習したツールです。

あなたの回帰タスクのためにニューラルネットワークを構築するのに適しているようです。

4

私はここでいくつかのことが起こっていると思います。

まず、使用しているレイヤーアクティベーションとは異なる設定を使用することをおすすめします。特に、初心者にとっては、ネットワークの隠れた層にS字状の非線形性を使い、出力層を線形に活性化してみてください。これは典型的な監視ネットワークの最も一般的な設定であり、開始に役立つはずです。

私の目を引く2つ目のことは、あなたのトレーナーのweightDecayパラメータの値が比較的大きいことです。(比較的大きな値は入力と出力の自然なスケールによりますが)。私は初心者のためにそのパラメータを削除するか、その値を0に設定します。ウェイトディケイはネットワークがオーバーフィットしないようにする正則化ツールですが、そのパラメータの値をあまりに大きくするとネットワークの重みはすべて0になります非常に迅速に(そしてあなたのネットワークのグラジエントは基本的に0になるので、学習は中断されます)。トレーニング中に検証データセットのパフォーマンスが低下し始める場合は、weightDecayを0以外の値に設定してください。

5

ネットワーク(すなわち必ずしも範囲0..1に)任意の値を近似することができるようにするために、元々、ベンアリソンにより指摘したように、それは最終的な層の限られた出力範囲で活性化機能を使用しない重要あります。例えば、線形活性化関数はうまくいくはずです。ここで

はpybrainの基本的な要素から構築された単回帰の例です:

#---------- 
# build the dataset 
#---------- 
from pybrain.datasets import SupervisedDataSet 
import numpy, math 

xvalues = numpy.linspace(0,2 * math.pi, 1001) 
yvalues = 5 * numpy.sin(xvalues) 

ds = SupervisedDataSet(1, 1) 
for x, y in zip(xvalues, yvalues): 
    ds.addSample((x,), (y,)) 

#---------- 
# build the network 
#---------- 
from pybrain.structure import SigmoidLayer, LinearLayer 
from pybrain.tools.shortcuts import buildNetwork 

net = buildNetwork(1, 
        100, # number of hidden units 
        1, 
        bias = True, 
        hiddenclass = SigmoidLayer, 
        outclass = LinearLayer 
        ) 
#---------- 
# train 
#---------- 
from pybrain.supervised.trainers import BackpropTrainer 
trainer = BackpropTrainer(net, ds, verbose = True) 
trainer.trainUntilConvergence(maxEpochs = 100) 

#---------- 
# evaluate 
#---------- 
import pylab 
# neural net approximation 
pylab.plot(xvalues, 
      [ net.activate([x]) for x in xvalues ], linewidth = 2, 
      color = 'blue', label = 'NN output') 

# target function 
pylab.plot(xvalues, 
      yvalues, linewidth = 2, color = 'red', label = 'target') 

pylab.grid() 
pylab.legend() 
pylab.show() 

側の発言(あなたのコード例で使用すると、線形活性化関数と隠れ層を持っているので):いずれにおいても、ので、中間層は、線形関数は有用ではない。

  • この層への入力側の重みは線形変換を形成
  • 活性化関数は、この層の出力側の重み
  • 線形である層に対応する彼らは同様に、任意の還元なしに除去することができる、すなわち、一つの線形変換とすることができる線形変換

を形成近似することができる関数の集合である。ニューラルネットワークの重要なポイントは、活性化関数が隠れ層で非線形であることです。

0

Andre Holznerが説明したように、隠れ層は非線形でなければなりません。 Andreのコード例は素晴らしいですが、多くの機能があり、それほど多くのデータがない場合はうまく機能しません。この場合、隠れ層が大きいため、かなり近似しますが、より複雑なデータを扱う場合、出力レイヤーの線形関数だけでは不十分です。フィーチャを正規化して範囲内になるようにする必要があります[0..1] 。

関連する問題