シーケンスの次の値を予測するために、(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
次の値は何ですか
これらの例に類似していて、詳細な説明がある限り、独自の例を自由に使用してください。
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]
いまいち...
これらの手順は、質問の最初の部分で要求することを実行するためのものです。
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()
を使用してそのシーケンスにサンプル(機能と呼ぶ)を追加します。
これが明確であることを願っています:)
ライブラリをインポートする手間を省くための完全なコードが必要な場合は、お知らせください。