3

以下のコードを使用します。

tf = open('defl_07h.csv','r')

for line in tf.readlines():
    data = [float(x) for x in line.strip().split(';') if x != '']
    indata =  tuple(data[:1])
    outdata = tuple(data[1:])
    ds.addSample(indata,outdata)

net = buildNetwork(ds.indim,20,ds.outdim,recurrent=True)
t = BackpropTrainer(net,learningrate=0.01,momentum=0.5,verbose=True)
t.trainOnDataset(ds,10)
t.testOnData(verbose=True)

次のように同じ出力を取得します。

出力: [3.479] 正しい: [11.86] エラー: 35.12389858 出力: [3.479] 正しい: [12.1] エラー: 37.16423359 出力: [3.479] 正しい: [12.28] エラー: 38.73228485

次に、作成されたネットワーク構造:

Module: in
-connection to hidden0
- parameters [-1.9647867  -0.41898579 -0.24047698  0.6445537   0.06084947 -3.17343892
  0.25454776 -0.45578641  0.70865416 -0.40517853 -0.22026247 -0.13106284
 -0.71012557 -0.61140289 -0.00752148 -0.61770292 -0.50631486  0.95803659
 -1.07403163 -0.87359713]
Recurrent connections
Module: bias
-connection to out
- parameters [ 0.55130311]
-connection to hidden0
- parameters [-0.31297409 -0.2182261  -0.70730661 -1.65964456 -0.18366456  0.52280203
 -0.03388935  0.61288256  2.49908814  0.53909862 -0.56139066  0.06752532
 -0.71713239 -1.4951833   0.84217369  0.16025118  0.01176442 -0.59444178
  0.85652564  1.60607469]
Recurrent connections
Module: hidden0
-connection to out
- parameters [ 1.00559033 -0.02308752 -2.51970163  0.39714524  0.33257302 -0.6626978
 -0.53004298 -1.0141971  -0.95530079 -0.66953093 -0.00438377 -1.1945728
  0.99363152 -1.17032002  0.03620047 -0.21081934  0.2550164  -1.65894533
  0.20820361 -1.38895542]
Recurrent connections
Module: out
Recurrent connections

どこにエラーがありますか?

4

1 に答える 1

6

あなたのコード サンプルにはいくつかの問題があり、ネットワークが意味のあることを何も学習しない原因になっています。あなたのコードにはいくつかの問題があります:

  1. あなたのデータは正規化されていません!ニューラル ネットワークは、入力されるデータの範囲に敏感です。あなたの場合、入力とターゲットを -1,1 または 0,1 の範囲で正規化する必要がある場合に、最小 ~2500 および最大 ~36000 の範囲を指定しました (Tanh または Sigmoid を使用したかどうかによって異なります)。 .
  2. BackpropTrainer一般に、10 エポックをはるかに超えるトレーニングが必要なものを選択しました。100 または 1000 を試してください (またはRPromMinusTrainer、個人的に好きな を試してください)。

これらの問題の両方が原因で、ネットは単一の値を吐き出すことを学習しました。

私はあなたのコードを少し変更して、正規化とRPropMinusTrainerかなりの量の反復を含めました(RProp-必要なエポックははるかに少なくなりました):

from pybrain.supervised.trainers import *
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet, SequentialDataSet
from pybrain.structure import RecurrentNetwork
from pybrain.structure import TanhLayer
import numpy as np

ds = SupervisedDataSet(1, 1)

tf = open('defl_07h.csv','r')

for line in tf.readlines():
    data = [float(x) for x in line.strip().split(';') if x != '']
    indata =  tuple(data[:1])
    outdata = tuple(data[1:])
    ds.addSample(indata,outdata)

i = np.array([d[0] for d in ds])
i /= np.max(np.abs(i),axis=0)
o = np.array([d[1] for d in ds])
o /= np.max(np.abs(o),axis=0)

nds = SupervisedDataSet(1, 1)
for ix in range(len(ds)):
    nds.addSample( i[ix], o[ix])

# train with normalized
net = buildNetwork(nds.indim,5,nds.outdim,recurrent=True)
t = RPropMinusTrainer(net,verbose=True)
t.trainOnDataset(nds,30)
t.testOnData(nds, verbose=True)

次の出力が得られます。

out:     [  0.234]
correct: [  0.168]
error:  0.00217289
out:     [  0.209]
correct: [  0.168]
error:  0.00083736
...
out:     [  0.986]
correct: [  0.914]
error:  0.00258013
out:     [  1.006]
correct: [  0.916]
error:  0.00405199
out:     [  0.985]
correct: [  0.924]
error:  0.00187248

完全ではありませんが、元の (事前に正規化された) データと同じように、実際の正規化された値で予測が増加します。

PS:これは古い質問であることは知っていますが、過去にこの問題にぶつかり、一部の人々に役立つかもしれないと考えました。したがって、もしあなたが NN の塹壕にいてどこにもたどり着かない場合は、自問することを忘れないでください: 私のニューラル ネットワークは正規化されたデータを期待していますか? 私は十分に訓練していますか?

于 2014-10-08T23:07:36.657 に答える