webentwicklung-frage-antwort-db.com.de

Pybrain-Zeitreihenvorhersage mit wiederkehrenden LSTM-Netzen

Ich habe eine Frage, die sich auf die Verwendung von Pybrain bezieht, um eine Regression einer Zeitreihe durchzuführen. Ich plane, die LSTM-Schicht in pybrain zu verwenden, um eine Zeitreihe zu trainieren und vorherzusagen.

Ich habe einen Beispielcode hier im Link unten gefunden

Anfrage zum Beispiel: Wiederholtes neuronales Netzwerk zum Vorhersagen des nächsten Wertes in einer Sequenz

Im obigen Beispiel kann das Netzwerk eine Sequenz nach dem Training vorhersagen. Das Problem ist jedoch, dass das Netzwerk alle sequentiellen Daten aufnimmt, indem es auf einmal zur Eingabeebene geleitet wird. Wenn beispielsweise die Trainingsdaten jeweils 10 Merkmale haben, werden die 10 Merkmale gleichzeitig in 10 Eingangsknoten eingespeist. 

Nach meinem Verständnis ist dies keine Zeitreihenvorhersage mehr, oder? Da es keinen Unterschied gibt in Bezug auf die Zeit, zu der jedes Feature in das Netzwerk eingespeist wird? Korrigieren Sie mich, wenn ich falsch liege. 

Daher versuche ich ein wiederkehrendes Netzwerk, das nur einen Eingangsknoten und einen Ausgangsknoten hat. Der Eingangsknoten ist der Ort, an dem alle Zeitreihendaten sequentiell zu verschiedenen Zeitschritten zugeführt werden. Das Netzwerk wird darauf trainiert, die Eingabe am Ausgangsknoten wiederzugeben. 

Könnten Sie mir bitte beim Aufbau des Netzwerks, das ich erwähnt habe, vorschlagen oder mich anleiten? Vielen Dank im Voraus.

15
dnth

Sie können ein LSTM-Netzwerk mit einem einzelnen Eingangsknoten und einem einzelnen Ausgangsknoten trainieren, um eine Zeitreihenvorhersage wie folgt durchzuführen:

Lassen Sie uns zunächst einmal die Druckfunktion von Python3 verwenden:

from __future__ import print_function

Dann machen Sie eine einfache Zeitreihe:

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]

Legen Sie diese Zeitreihe nun in ein überwachtes Dataset, wobei das Ziel für jede Stichprobe die nächste Stichprobe ist:

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)

Erstellen Sie ein einfaches LSTM-Netzwerk mit 1 Eingangsknoten, 5 LSTM-Zellen und 1 Ausgangsknoten:

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

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

Trainiere das Netzwerk:

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])

Zeichnen Sie die Fehler auf (beachten Sie, dass wir in diesem einfachen Spielzeugbeispiel den gleichen Datensatz testen und trainieren. Dies ist natürlich nicht das, was Sie für ein echtes Projekt tun würden!)

import matplotlib.pyplot as plt

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

Bitten Sie jetzt das Netzwerk, die nächste Probe vorherzusagen:

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()

(Der obige Code basiert auf dem example_rnn.py und den Beispielen aus der PyBrain-Dokumentation )

26
Jack Kelly

Ich habe LSTM getestet, um einen zeitlichen Ablauf mit Theano vorherzusagen. Ich habe festgestellt, dass für eine glatte Kurve dies richtig vorhergesagt werden kann. Allerdings für einige Zick-Zack-Kurve. Es ist schwer vorherzusagen. Die detaillierten Artikel sind wie folgt: Zeitsequenz mit LSTM vorhersagen

Das vorhergesagte Ergebnis kann wie folgt angezeigt werden: http://www.fuzihao.org/blog/images/LSTM_predict.png

1
maple

Ich denke, ein besseres (einfacheres/klareres) Beispiel, von dem man lernen kann, wäre hier am Ende der Seite:

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

Nach dem Einrichten wie gezeigt, verfolgt es im Wesentlichen den Verlauf der Eingänge (bis und wenn Sie nicht auf reset) klicken. Aus den Dokumenten:

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

"Bis .reset () aufgerufen wird, verfolgt das Netzwerk alle vorherigen Eingaben und ermöglicht so die Verwendung wiederkehrender Verbindungen und Schichten, die in der Zeit zurückblicken."

Ja, keine Notwendigkeit, jedes Mal alle vorherigen Eingaben erneut im Netzwerk anzuzeigen.

1
rossdavidh