Angenommen, Sie haben Zeitreihendaten mit Zeilen und Spalten, die Sie einem Layer in Keras zuführen möchten . Bevor Sie dies dem RNN zuführen, müssen Sie die vorherigen Daten in einen 3D-Tensor umformen. Es wird also .N700SimpleRNN(200, return_sequence=True)
N×700×1
Das Bild stammt von https://colah.github.io/posts/2015-08-Understanding-LSTMs
In RNN sind Ihre Spalten (die "700 Spalten") die Zeitschritte von RNN. Ihre Daten werden von . Nach dem Einspeisen der Daten in das RNN hat es nun 700 Ausgänge, die bis und nicht bis . Denken Sie daran, dass die Form Ihrer Daten jetzt ist , dh Abtastwerte (die Zeilen) x Zeitschritte (die Spalten) x Kanäle .t=1 to 700h1h700h1h200N×700×200
Und dann, wenn Sie a anwenden TimeDistributedDense
, wenden Sie Dense
bei jedem Zeitschritt eine Ebene an, was bedeutet, dass Sie jeweils eine Dense
Ebene auf , , ..., . Das heißt: Tatsächlich wenden Sie den vollständig verbundenen Vorgang auf jeden seiner Kanäle (den "200") an, und zwar von bis . Das erste " " bis zum 700. " ".h1h2hth1h7001×1×2001×1×200
Warum machen wir das? Weil Sie die RNN-Ausgabe nicht reduzieren möchten.
Warum nicht die RNN-Ausgabe reduzieren? Weil Sie jeden Zeitschritt getrennt halten möchten.
Warum sollten die einzelnen Zeitstufenwerte getrennt bleiben? Weil:
- Sie möchten nur die Werte zwischen ihren eigenen Zeitschritten interagieren
- Sie möchten keine zufällige Interaktion zwischen verschiedenen Zeitschritten und Kanälen.