web-dev-qa-db-ja.com

例:シーケンスの次の値を予測するためのリカレントニューラルネットワーク

シーケンスの次の値を予測するために、(pybrain)pythonのリカレントニューラルネットワークの実用的な例を誰かに教えてもらえますか?(pybrainのドキュメントを読みましたが、明確なものはありませんその例だと思います。)私もこれを見つけました 質問 。しかし、より一般的なケースでどのように機能するかわかりません。したがって、ここの誰かがリカレントニューラルネットワークを使用して、Pythonでシーケンスの次の値を予測する方法の明確な例。

例を挙げると。

たとえば、[1,7]の範囲の数値のシーケンスがあるとします。

First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

Second run (So second example): 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6

Third run (So third example): 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7

and so on.

たとえば、新しいシーケンスの開始が与えられます:1 3 5 7 2 4 6 7 1 3

次の値は何ですか

この質問は怠惰に思えるかもしれませんが、pybrainでこれを行う方法の良い適切な例が欠けていると思います。


さらに:複数の機能が存在する場合、これをどのように行うことができますか:

例:

たとえば、範囲[1,7]にいくつかのシーケンス(各シーケンスには2つの特徴がある)があるとします。

First run (So first example): feature1: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
                              feature2: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7


Second run (So second example): feature1: 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
                                feature2: 1 2 3 7 2 3 4 6 2 3 5 6 7 2 4 7 1 3 3 5 6    

Third run (So third example): feature1: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
                              feature2: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

and so on.

ここで、たとえば新しいシーケンスの開始を示します。

                                            feature 1: 1 3 5 7 2 4 6 7 1 3

                                            feature 2: 1 2 3 7 2 3 4 6 2 4

次の値は何ですか


これらの例に類似していて、詳細な説明がある限り、独自の例を自由に使用してください。

28
Olivier_s_j

Issam Laradjiは、私のバージョンのpybrainがUnserpervisedDataSetオブジェクトのタプルを必要としたことを除いて、シーケンスのシーケンスを予測するために私のために働きました。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(21, 21)
ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(21,)
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]

与える:

=> [1, 2, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6, 7, 1, 4, 6, 1, 2, 2, 3, 6]

より小さなシーケンスを予測するには、サブシーケンスまたはオーバーラップシーケンス(ここにオーバーラップを示します)としてトレーニングします。

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(10, 11)
z = map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split())
obsLen = 10
predLen = 11
for i in xrange(len(z)):
  if i+(obsLen-1)+predLen < len(z):
    ds.addSample([z[d] for d in range(i,i+obsLen)],[z[d] for d in range(i+1,i+1+predLen)])

net = buildNetwork(10, 20, 11, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(10,)
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3'.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]

与える:

=> [3, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6]

いまいち...

8
wwwslinger

これらの手順は、質問の最初の部分で要求することを実行するためのものです。

1)引数にサンプルとターゲットが必要な監視対象データセットを作成します。

_ ds = SupervisedDataSet(21, 21)
 #add samples (this can be done automatically)
 ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
 ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
_

後続のサンプルは、その前のyのターゲットまたはラベルxです。各サンプルには_21_の番号または機能があるため、番号_21_を付けます。

質問の後半の標準表記については、シーケンスのsample1およびsample2としてfeature1およびfeature2を呼び出し、featuresがサンプル内の番号を示すようにすることをお勧めします。

2)ネットワークを作成し、トレーナーを初期化して、100エポックにわたって実行します

_net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
_

必ずrecurrent引数をTrueとして設定してください

3)テストデータを作成する

_ts = UnsupervisedDataSet(21, 21)
#add the sample to be predicted
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
_

ラベルやターゲットがないことを前提として、監視なしのデータセットを作成しました。

4)トレーニングされたネットワークを使用してテストサンプルを予測します

_net.activateOnDataset(ts)
_

これにより、予想される_fourth run_の値が表示されます。

シーケンスにサンプル以上のものがある可能性がある2番目のケースでは、監視対象データセットを作成する代わりに、シーケンシャルなds = SequentialDataSet(21,21)を作成します。次に、新しいシーケンスを取得するたびに、ds.newSequence()を呼び出し、ds.addSample()を使用してそのシーケンスにサンプル(機能と呼ぶ)を追加します。

これが明確であることを願っています:)

ライブラリをインポートする手間を省くための完全なコードが必要な場合は、お知らせください。

4
Curious