2014-09-22 97 views
15

我有一個問題,它涉及到使用pybrain做時間序列的迴歸。我計劃在pybrain中使用LSTM層來訓練和預測時間序列。使用LSTM經常性網絡的Pybrain時間序列預測

我發現的示例代碼在這裏在下面的鏈接

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

在上面的例子中,網絡是能夠預測其被訓練後的序列。但問題是,網絡通過一次性輸入輸入層來獲取所有連續數據。例如,如果訓練數據每個具有10個特徵,則10個特徵將同時被同時饋送到10個輸入節點中。

從我的理解,這不再是一個時間序列預測我是對嗎?由於每個功能都被送入網絡的時間沒有區別?糾正我,如果我錯了。

因此,我試圖實現的是一個只有一個輸入節點和一個輸出節點的經常性網絡。輸入節點是所有時間序列數據將在不同時間步驟按順序饋送的位置。網絡將被訓練以在輸出節點再現輸入。

你能否建議或指導我構建我提到的網絡? 非常感謝您提前。

回答

25

你可以用一個單一的輸入節點和做時間序列預測這樣的單一輸出節點訓練的LSTM網絡:

首先,就像一個很好的做法,讓我們使用Python3的打印功能:

from __future__ import print_function 

然後,作一個簡單的時間序列:

data = [1] * 3 + [2] * 3 
data *= 3 
print(data) 

[1,1,1,2,2,2,1,1,1,2,2,2,1,1,1, 2,2,2]

立即把這個時間序列到一個監督數據集,其中每個樣本的目標是下一樣本:

from pybrain.datasets import SequentialDataSet 
from itertools import cycle 

ds = SequentialDataSet(1, 1) 
for sample, next_sample in zip(data, cycle(data[1:])): 
    ds.addSample(sample, next_sample) 

構建簡單LSTM網絡與1個輸入節點,5個LSTM細胞和1個輸出節點:

from pybrain.tools.shortcuts import buildNetwork 
from pybrain.structure.modules import LSTMLayer 

net = buildNetwork(1, 5, 1, 
        hiddenclass=LSTMLayer, outputbias=False, recurrent=True) 

訓練網絡:

from pybrain.supervised import RPropMinusTrainer 
from sys import stdout 

trainer = RPropMinusTrainer(net, dataset=ds) 
train_errors = [] # save errors for plotting later 
EPOCHS_PER_CYCLE = 5 
CYCLES = 100 
EPOCHS = EPOCHS_PER_CYCLE * CYCLES 
for i in xrange(CYCLES): 
    trainer.trainEpochs(EPOCHS_PER_CYCLE) 
    train_errors.append(trainer.testOnData()) 
    epoch = (i+1) * EPOCHS_PER_CYCLE 
    print("\r epoch {}/{}".format(epoch, EPOCHS), end="") 
    stdout.flush() 

print() 
print("final error =", train_errors[-1]) 

繪製錯誤(注意,在這個簡單的玩具例如,我們正在測試和對同一數據集,這當然不是你一個真正的項目做培訓):

import matplotlib.pyplot as plt 

plt.plot(range(0, EPOCHS, EPOCHS_PER_CYCLE), train_errors) 
plt.xlabel('epoch') 
plt.ylabel('error') 
plt.show() 

現在問的網絡來預測下一個樣本:

for sample, target in ds.getSequenceIterator(0): 
    print("    sample = %4.1f" % sample) 
    print("predicted next sample = %4.1f" % net.activate(sample)) 
    print(" actual next sample = %4.1f" % target) 
    print() 

(上面的代碼是基於example_rnn.py並從PyBrain documentation實施例)

+0

我可否要求在訓練步驟中的一些說明。訓練階段的CYCLES和EPOCHS_PER_CYCLE部分究竟做了什麼?它與僅僅訓練多少個時代有何不同呢? – 2015-10-27 10:00:37

+0

@ A.Devereux它正在保存錯誤。我認爲作者希望保存每個EPOCHS_PER_CYCLE中的錯誤,在這種情況下,它比所有錯誤小5倍。 – MCSH 2016-01-08 13:14:20

1

我想一個更好的(簡單/更清晰)爲例,從學習會在這裏,實現頁面的底部:

http://pybrain.org/docs/tutorial/netmodcon.html

從本質上講,一旦設置如圖所示,它會自動跟蹤的輸入歷史記錄(直到並且除非您重置)。從文檔:

http://pybrain.org/docs/api/structure/networks.html?highlight=recurrentnetwork#pybrain.structure.networks.RecurrentNetwork

「直到.reset段()被調用時,網絡跟蹤的所有以前的輸入,從而允許使用時間回顧反覆連接和層。」

所以是的,每次都不需要重新呈現所有過去的網絡輸入。

1

我已經測試LSTM預測患有Theano一些時間序列。我發現對於一些光滑的曲線,它可以被正確預測。但是對於一些曲折曲線。很難預測。詳細文章情況如下: Predict Time Sequence with LSTM

預測結果可以證明如下: http://www.fuzihao.org/blog/images/LSTM_predict.png

+0

嘿楓,我讀了你的代碼,我想知道它是否公開?我試圖將這些部分放在您的網站上,但仍然不確定一些變量。你能讓我知道嗎?謝謝 – ahajib 2016-05-24 13:49:27

+1

嗨,@ nimafl,代碼沒有公開,因爲我沒有修剪代碼。現在只是一堆麪條。如果有些事情讓你困惑,請在博客下面留言,我會盡力解釋。 – maple 2016-05-25 14:58:39

+0

謝謝。我一定會在那裏尋求幫助。 – ahajib 2016-05-25 15:12:52

相關問題