web-dev-qa-db-ja.com

LSTMリカレントネットを使用したPybrain時系列予測

私は時系列の回帰を行うためのpybrainの使用に関連する質問を覚えています。 pybrainのLSTMレイヤーを使用して、時系列のトレーニングと予測を行う予定です。

以下のリンクでサンプルコードを見つけました

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

上記の例では、ネットワークはトレーニングされた後のシーケンスを予測できます。しかし、問題は、ネットワークがすべてのシーケンシャルデータを1つの入力レイヤーにフィードすることで取り込むことです。たとえば、トレーニングデータにそれぞれ10個のフィーチャがある場合、10個のフィーチャは同時に10個の入力ノードに同時にフィードされます。

私の理解から、これはもはや時系列予測ではありませんね?各機能がネットワークにフィードされる時間に違いはないのですか?私がこれについて間違っているなら、私を訂正してください。

したがって、私が達成しようとしているのは、1つの入力ノードと1つの出力ノードのみを持つリカレントネットワークです。入力ノードは、すべての時系列データが異なるタイムステップで順次供給される場所です。ネットワークは、出力ノードで入力を再現するようにトレーニングされます。

私が言及したネットワークを構築する際に私を提案または案内していただけませんか?事前にどうもありがとうございました。

15
dnth

次のような時系列予測を行うために、単一の入力ノードと単一の出力ノードで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)

入力ノードが1つ、LSTMセルが5つ、出力ノードが1つのシンプルなLSTMネットワークを構築します。

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ドキュメント )の例

28
Jack Kelly

Theanoを使用して、LSTM予測の時系列をテストしました。滑らかな曲線の場合、正しく予測できることがわかりました。ただし、ジグザグ曲線の場合。予測するのは難しいです。詳細な記事は以下のとおりです。 LSTMで時系列を予測

予測結果は次のように表示できます: http://www.fuzihao.org/blog/images/LSTM_predict.png

1
maple

私が学ぶべきより良い(より単純でより明確な)例は、ページの下部にあるここにあると思います:

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

基本的に、図のように設定すると、入力の過去の履歴を自動的に追跡します(リセットするまで、リセットを押すまで)。ドキュメントから:

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

「.reset()が呼び出されるまで、ネットワークは以前のすべての入力を追跡しているため、時間をさかのぼって再帰的な接続とレイヤーを使用できます。」

したがって、毎回ネットワークへの過去の入力をすべて再表示する必要はありません。

1
rossdavidh