私は時系列の回帰を行うためのpybrainの使用に関連する質問を覚えています。 pybrainのLSTMレイヤーを使用して、時系列のトレーニングと予測を行う予定です。
以下のリンクでサンプルコードを見つけました
リクエストの例:シーケンスの次の値を予測するためのリカレントニューラルネットワーク
上記の例では、ネットワークはトレーニングされた後のシーケンスを予測できます。しかし、問題は、ネットワークがすべてのシーケンシャルデータを1つの入力レイヤーにフィードすることで取り込むことです。たとえば、トレーニングデータにそれぞれ10個のフィーチャがある場合、10個のフィーチャは同時に10個の入力ノードに同時にフィードされます。
私の理解から、これはもはや時系列予測ではありませんね?各機能がネットワークにフィードされる時間に違いはないのですか?私がこれについて間違っているなら、私を訂正してください。
したがって、私が達成しようとしているのは、1つの入力ノードと1つの出力ノードのみを持つリカレントネットワークです。入力ノードは、すべての時系列データが異なるタイムステップで順次供給される場所です。ネットワークは、出力ノードで入力を再現するようにトレーニングされます。
私が言及したネットワークを構築する際に私を提案または案内していただけませんか?事前にどうもありがとうございました。
次のような時系列予測を行うために、単一の入力ノードと単一の出力ノードで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ドキュメント )の例
Theanoを使用して、LSTM予測の時系列をテストしました。滑らかな曲線の場合、正しく予測できることがわかりました。ただし、ジグザグ曲線の場合。予測するのは難しいです。詳細な記事は以下のとおりです。 LSTMで時系列を予測
予測結果は次のように表示できます: http://www.fuzihao.org/blog/images/LSTM_predict.png
私が学ぶべきより良い(より単純でより明確な)例は、ページの下部にあるここにあると思います:
http://pybrain.org/docs/tutorial/netmodcon.html
基本的に、図のように設定すると、入力の過去の履歴を自動的に追跡します(リセットするまで、リセットを押すまで)。ドキュメントから:
「.reset()が呼び出されるまで、ネットワークは以前のすべての入力を追跡しているため、時間をさかのぼって再帰的な接続とレイヤーを使用できます。」
したがって、毎回ネットワークへの過去の入力をすべて再表示する必要はありません。