Ich möchte den nächsten Frame eines (Graustufen-) Videos vorhersagen, der N
vorhergehende Frames gegeben hat - mit CNNs oder RNNs in Keras. Die meisten Tutorials und andere Informationen zur Zeitreihenvorhersage und Keras verwenden einen 1-dimensionalen Input in ihrem Netzwerk, aber meiner wäre 3D (N frames x rows x cols)
Ich bin mir zur Zeit wirklich nicht sicher, was ein guter Ansatz für dieses Problem wäre. Meine Ideen beinhalten:
Verwenden einer oder mehrerer LSTM-Ebenen. Das Problem hier ist, dass ich nicht sicher bin, ob sie geeignet sind, um eine Reihe von Bildern statt einer Reihe von Skalaren als Eingabe zu nehmen. Würde der Speicherverbrauch nicht explodieren? Wenn es in Ordnung ist, sie zu verwenden: Wie kann ich sie in Keras für höhere Dimensionen verwenden?
Verwenden von 3D-Faltung am Eingang (der Stapel vorheriger Videoframes). Das wirft andere Fragen auf: Warum würde das helfen, wenn ich keine Klassifizierung, sondern eine Vorhersage mache? Wie kann ich die Layer so stapeln, dass der Input des Netzwerks die Dimensionen (N x cols x rows)
und die Ausgabe (1 x cols x rows)
?
Ich bin ziemlich neu bei CNNs / RNNs und Keras und würde mich über jeden Hinweis in die richtige Richtung freuen.
Grundsätzlich hat also jeder Ansatz seine Vor- und Nachteile. Lassen Sie uns die von Ihnen zur Verfügung gestellten und dann anderen durchgehen, um den besten Ansatz zu finden:
LSTM
: Zu ihren größten Vorteilen gehört die Fähigkeit, langfristige Abhängigkeitsmuster in Ihren Daten zu erkennen. Sie wurden entworfen, um lange Sequenzen wie z.B. Rede oder Text. Dies kann auch Probleme aufgrund von Anzahlparametern verursachen, die wirklich hoch sein können. Andere typische wiederkehrende Netzwerkarchitekturen wie GRU
könnten diese Probleme beheben. Der Hauptnachteil ist, dass es in ihrem Standard (sequentielle Implementierung) unmöglich ist, sie auf Videodaten anzupassen, und zwar aus dem gleichen Grund, weshalb dichte Schichten für Bilddaten nicht geeignet sind - eine vollständige Topologie muss eine Menge an Zeit und räumlichen Invarianzen lernen nicht geeignet, um sie effizient zu fangen. Wenn Sie ein Video um ein Pixel nach rechts verschieben, ändert sich möglicherweise die Ausgabe Ihres Netzwerks.
Es ist noch erwähnenswert, dass das Training LSTM
als ähnlich empfunden wird, um ein Gleichgewicht zwischen zwei Konkurrenzprozessen zu finden - gute Gewichte für eine dichte-ähnliche Ausgabeberechnung zu finden und eine gute zu finden Innerspeicher Dynamik in Verarbeitungssequenzen. Dieses Gleichgewicht zu finden, könnte sehr lange dauern, aber wenn es einmal gefunden ist - es ist normalerweise ziemlich stabil und liefert wirklich gute Ergebnisse.
Conv3D
: Unter ihren größten Vorteilen kann man leicht eine Fähigkeit finden, räumliche und zeitliche Invarianzen auf die gleiche Weise wie Conv2D
in einem Bilderfall zu erfassen. Dies macht den Fluch der Dimensionalität viel weniger schädlich. Auf der anderen Seite - so wie Conv1D
bei längeren Sequenzen auch keine guten Ergebnisse liefert - könnte ein Mangel an Speicher das Lernen einer langen Sequenz erschweren.
Natürlich kann man verschiedene Ansätze verwenden wie:
TimeDistributed + Conv2D
: Verwenden eines TimeDistributed
Wrappers - man kann ein vortrainiertes Convnet verwenden, wie z.B. Inception
frameweise und dann die Feature-Maps sequenziell analysieren. Ein wirklich großer Vorteil dieses Ansatzes ist die Möglichkeit eines Transferlernens. Als Nachteil - man könnte darüber nachdenken als Conv2.5D
- fehlt eine zeitliche Analyse Ihrer Daten.
ConvLSTM
: Diese Architektur wird noch nicht von der neuesten Version von Keras
(am 6. März 2017) unterstützt, aber wie man sieht hier sollte es in Zukunft bereitgestellt werden. Dies ist eine Mischung aus LSTM
und Conv2D
und es wird geglaubt, dass es besser ist als Conv2D
und LSTM
zu stapeln.
Natürlich sind das nicht die einzigen Wege, um dieses Problem zu lösen, ich werde noch eine erwähnen, die nützlich sein könnte:
TimeDistributed(ResNet)
transformiert wird, dann die Ausgabe an Conv3D
mit multiplen und aggressiven räumlichen Bündeln und schließlich mit einer GRU/LSTM
Schicht transformiert wird. PS:
Noch etwas, das erwähnenswert ist, ist, dass die Form der Videodaten tatsächlich 4D
mit (frames, width, height, channels
) ist.
PS2:
Wenn Ihre Daten tatsächlich 3D
mit (frames, width, hieght)
sind, könnten Sie tatsächlich eine klassische Conv2D
verwenden (indem Sie channels
in frames
ändern), um diese Daten zu analysieren (was tatsächlich rechenwirksamer sein könnte). Im Falle eines transfer learning sollten Sie eine zusätzliche Dimension hinzufügen, da die meisten CNN
Modelle auf Daten mit der Form (width, height, 3)
trainiert wurden. Möglicherweise stellen Sie fest, dass Ihre Daten nicht über 3 Kanäle verfügen. In diesem Fall wird eine räumliche Matrix dreimal wiederholt
PS3:
Ein Beispiel für diesen 2.5D
Ansatz ist:
Nachdem ich viel recherchiert hatte, bin ich endlich auf das Keras Beispiel gestoßen ConvLSTM2D
layer (bereits von Marcin Możejko erwähnt), was genau das tut, was ich brauche.
In der aktuellen Version von Keras (v1.2.2) ist diese Ebene bereits enthalten und kann mit
importiert werden %Vor%Um diese Ebene zu verwenden, müssen die Videodaten wie folgt formatiert werden:
%Vor%Tags und Links neural-network machine-learning lstm keras time-series