(Ich teste meine Fähigkeiten, um kurze, aber effektive Fragen zu schreiben, lasst mich wissen, wie ich hier vorgehen kann)
Ich versuche ein TensorFlow rekurrentes neurales Netzwerk, speziell ein LSTM, mit einigen Versuchen von Zeitreihendaten im folgenden ndarray Format zu trainieren / zu testen:
%Vor%Der 1d Teil dieses 3darrays enthält den Zeitschritt und alle Feature-Werte, die zu diesem Zeitpunkt beobachtet wurden. Der Block 2d enthält alle 1d-Arrays (Zeitschritte), die in einem Versuch beobachtet wurden. Der 3d Block enthält alle 2D-Blöcke (Versuche), die für den Zeitreihendatensatz aufgezeichnet wurden. Für jeden Versuch ist die Zeitschrittfrequenz konstant und das Fensterintervall ist für alle Versuche gleich (0 bis 50 Sekunden, 0 bis 50 Sekunden, usw.).
Zum Beispiel habe ich Daten für Formel-1-Rennwagen wie Drehmoment, Geschwindigkeit, Beschleunigung, Rotationsgeschwindigkeit, etc. gegeben. Über einen bestimmten Zeitintervall Aufnahmezeit Schritte alle 0,5 Sekunden, ich bilden 1d Arrays mit jedem Zeitschritt gegenüber aufgenommene Funktionen, die zu diesem Zeitpunkt aufgenommen wurden. Dann formiere ich ein 2D-Array um alle Zeitschritte, die dem Lauf eines Formel-1-Rennwagens entsprechen. Ich erstelle ein endgültiges 3D-Array mit allen F1-Autos und ihren Zeitreihendaten. Ich möchte ein Modell trainieren und testen, um Anomalien in den gemeinsamen F1-Trajektorien auf dem Kurs für neue Autos zu erkennen.
Mir ist derzeit bewusst, dass die TensorFlow-Modelle 2D-Arrays für Training und Tests unterstützen. Ich habe mich gefragt, welche Verfahren ich durchlaufen müsste, um das Modell in allen unabhängigen Versuchen (2d), die in diesem 3-D-Array enthalten sind, zu trainieren und zu testen. Außerdem werde ich in Zukunft weitere Versuche hinzufügen. Was sind die richtigen Verfahren, um mein Modell mit den neuen Daten / Studien ständig zu aktualisieren, um mein LSTM zu stärken.
Hier ist das Modell, das ich anfänglich versuchte, für einen anderen Zweck als die menschliche Aktivität zu replizieren: Ссылка . Ein anderes praktikableres Modell wäre das, was ich viel lieber für Anomalie-Erkennung in den Zeitreihendaten betrachten würde: Ссылка . Ich möchte ein Anomalie-Erkennungsmodell erstellen, das aufgrund der nicht-anormalen Zeitserien-Trainingsdaten Anomalien in den Testdaten erkennen kann, bei denen Teile der Daten im Laufe der Zeit als "außerhalb der Familie" definiert werden.
Ihre Eingabeform und das entsprechende Modell hängen davon ab, welche Art von Anomaly Sie erkennen möchten. Sie können Folgendes berücksichtigen:
1. Nur Merkmal Anomalie:
Hier betrachten Sie einzelne Merkmale und entscheiden, ob eine von ihnen Anomal ist, ohne zu berücksichtigen, wann sie gemessen wird. In Ihrem Beispiel ist das Merkmal [Drehmoment, Geschwindigkeit, Beschleunigung, ...] eine Anomalie, wenn einer oder mehrere einen Ausreißer in Bezug auf die anderen Merkmale darstellt. In diesem Fall sollten Ihre Eingaben die Form [batch, features]
haben.
2. Zeitmerkmal Anomalie:
Hier hängen Ihre Eingaben davon ab, wann Sie die Funktion messen. Ihre aktuelle Funktion kann von den vorherigen Funktionen abhängen, die im Laufe der Zeit gemessen wurden. Zum Beispiel kann es ein Merkmal geben, dessen Wert ein Ausreißer ist, wenn es zum Zeitpunkt 0 erscheint, aber nicht ausreißt, wenn es rechtzeitig erscheint. In diesem Fall teilen Sie jeden Ihrer Trails mit überlappenden Zeitfenstern und bilden einen Feature-Satz der Form [batch, time_window, features]
.
Es sollte sehr einfach sein mit (1) mit einem Autoencoder zu beginnen, wo Sie einen Auto-Encoder trainieren und auf den Fehler zwischen Input und Output, können Sie einen Schwellenwert wie 2-Standard Abweichungen wählen von der Mitte zu bestimmen, ob es ein Ausreißer ist oder nicht.
Für (2) können Sie das zweite Papier, das Sie erwähnt haben, mit einem seq2seq-Modell verfolgen, bei dem Ihr Decoder-Fehler bestimmt, welche Features Ausreißer sind. Sie können auf dies für die Implementierung eines solchen Modells.
Ich denke, für die meisten LSTMs werden Sie auf diese Weise an Ihre Daten denken (da es einfach als Eingabe für die Netzwerke verwendet werden kann).
Sie haben 3 Dimensionsmessungen:
feature_size = die Anzahl der verschiedenen Merkmale (Drehmoment, Geschwindigkeit usw.)
number_of_time_steps = die Anzahl der für ein einzelnes Fahrzeug gesammelten Zeitschritte
number_of_cars = die Anzahl der Autos
Es wird wahrscheinlich am einfachsten sein, Ihre Daten als Matrizen zu lesen, wobei jede Matrix einer ganzen Stichprobe entspricht (alle Zeitschritte für ein einzelnes Auto).
Sie können diese Matrizen so anordnen, dass jede Zeile eine Beobachtung ist und jede Spalte ein anderer Parameter ist (oder umgekehrt müssen Sie die Matrizen transponieren, schauen Sie sich an, wie Ihre Netzwerkeingabe formatiert ist).
So ist jede Matrix von der Größe: number_of_time_steps x feature_size (# Zeilen x # Spalten). Sie haben number_of_cars verschiedene Matrizen. Jede Matrix ist eine Probe.
Um Ihr Array in dieses Format zu konvertieren, können Sie diesen Code-Block verwenden (Sie können bereits auf ein einzelnes Sample in Ihrem Array mit A [n] zugreifen, aber dies macht die Form der Elemente, auf die zugegriffen wird Sie erwarten):
%Vor%Jetzt können Sie ein einzelnes Sample mit easy_format [n] erhalten, wobei n das gewünschte Beispiel ist.
%Vor%Jetzt können Sie sie formatieren, wie Sie es für das von Ihnen verwendete Netzwerk benötigen (Zeilen und Spalten bei Bedarf transponieren, jeweils ein einzelnes Sample oder alle gleichzeitig darstellen) / p>
Was Sie suchen (wenn ich dieses zweite Papier richtig lese), erfordert höchstwahrscheinlich eine Sequenz, um lstm oder rnn zu sequenzieren. Ihre ursprüngliche Sequenz ist Ihre Zeitreihe für eine bestimmte Testversion und Sie generieren eine Zwischengruppe von Gewichtungen (eine Einbettung), die diese ursprüngliche Sequenz mit einem geringen Fehlerbetrag wiederherstellen kann. Du machst das für alle Prüfungen. Sie werden dieses lstm auf einer Reihe einigermaßen normaler Versuche trainieren und es gut durchführen lassen (die Reihenfolge genau rekonstruieren). Sie können dann denselben Satz von Einbettungen verwenden, um zu versuchen, eine neue Sequenz zu rekonstruieren, und wenn es einen hohen Rekonstruktionsfehler hat, können Sie annehmen, dass es anomal ist.
Überprüfen Sie dieses Repo für ein Beispiel dessen, was Sie wollen, zusammen mit Erklärungen, wie es benutzt wird und was der Code macht (es bildet nur eine Folge von ganzen Zahlen zu einer anderen Folge von ganzen Zahlen ab, aber kann leicht zur Karte erweitert werden) eine Folge von Vektoren zu einer Folge von Vektoren): Ссылка Das Muster, das Sie definieren würden, ist nur Ihre ursprüngliche Sequenz. Sie können sich auch die Auto-Encoder für dieses Problem ansehen.
Final Edit: Überprüfen Sie dieses Repository: Ссылка
Ich habe den Code sehr leicht verändert, um an der neuesten Version von Tensorflow zu arbeiten und einige der Variablennamen klarer zu machen. Sie sollten es so ändern können, dass es in Ihrem Dataset ausgeführt wird. Im Moment bin ich gerade dabei, ein zufällig generiertes Array von Einsen und Nullen automatisch zu codieren. Sie würden dies für eine große Teilmenge Ihrer Daten tun und dann sehen, ob andere Daten genau rekonstruiert wurden oder nicht (ein viel höherer Fehler als der Durchschnitt könnte eine Anomalie bedeuten).
%Vor%Tags und Links python neural-network tensorflow python-3.x lstm