Der Unterschied zwischen `Dense` und` TimeDistributedDense` von `Keras`

34

Ich bin immer noch über den Unterschied zwischen verwirrt Denseund TimeDistributedDensevon Kerasobwohl es schon einige ähnliche Fragen hier und hier . Die Leute diskutieren viel, aber keine gemeinsamen Schlussfolgerungen.

Und obwohl @fchollet hier folgendes feststellte:

TimeDistributedDenseDenseWendet auf jeden Zeitschritt eines 3D-Tensors dieselbe (vollständig verbundene) Operation an.

Ich brauche noch eine detaillierte Illustration darüber, was genau der Unterschied zwischen ihnen ist.

fließend03
quelle

Antworten:

41

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

entrollte RNN

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 Densebei jedem Zeitschritt eine Ebene an, was bedeutet, dass Sie jeweils eine DenseEbene 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.
rilut
quelle
Und wenn Sie dann eine TimeDistributedDense anwenden, wenden Sie auf jeden Zeitschritt eine Dense-Ebene an -> Bedeutet dies, dass jeder Zeitschritt das Gewicht der Dense-Ebene teilt? Gilt die Ebene "Dichte" nicht nur für den letzten Zeitschritt?
o0omycomputero0o
2
Warum wird TimeDistributedDense im Keras-Beispiel auf blog.keras.io/… nicht verwendet ?
user1934212
Weil TimeDistributedDense bereits veraltet ist. Seit Keras 2.0 kann Dense mit> 2-dimensionalen Tensoren gut
umgehen