簡體   English   中英

請求例如:用於預測序列中的下一個值的遞歸神經網絡

[英]Request for example: Recurrent neural network for predicting next value in a sequence

任何人都可以給我一個(pybrain)python中循環神經網絡的實例,以預測序列的下一個值嗎? (我已經閱讀了pybrain文檔,我認為沒有明確的例子。)我也發現了這個問題 但我沒有看到它在更一般的情況下是如何工作的。 因此,我在問這里是否有人能夠找到一個明確的例子,說明如何使用遞歸神經網絡預測pybrain中序列的下一個值

舉個例子。

比方說,我們有一系列數字在[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()))

后續樣本是其前身x的目標或標簽y 我們將數字21因為每個樣本都有21數字或特征。

請注意,對於問題后半部分的標准符號,最好將feature1和feature2稱為sample1和sample2作為序列,並讓feature表示樣本中的數字。

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的值。

對於第二種情況,當序列可以具有多個樣本時,不是創建監督數據集,而是創建順序ds = SequentialDataSet(21,21) 然后,每次獲得新序列時,調用ds.newSequence()並使用ds.addSample()添加您在該序列中調用features的樣本。

希望這是明確的:)

如果您希望獲得完整的代碼以省去導入庫的麻煩,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM