La differenza tra `Dense` e` TimeDistributedDense` di `Keras`


34

Sono ancora confuso sulla differenza tra Densee TimeDistributedDensedi Kerasanche se ci sono già alcune domande simili poste qui e qui . Le persone discutono molto, ma nessuna conclusione condivisa.

E anche se, qui , @fchollet ha dichiarato che:

TimeDistributedDenseapplica una stessa operazione Dense(completamente connessa) a ogni timestep di un tensore 3D.

Ho ancora bisogno di un'illustrazione dettagliata su quale sia esattamente la differenza tra loro.

Risposte:


41

Supponiamo che tu abbia dati di serie temporali con righe e colonne che desideri alimentare a un livello in Keras. Prima di inviarlo a RNN, è necessario rimodellare i dati precedenti in un tensore 3D. Quindi diventa un .N700SimpleRNN(200, return_sequence=True)N×700×1

RNN non srotolato

L'immagine è tratta da https://colah.github.io/posts/2015-08-Understanding-LSTMs

In RNN, le colonne (le "700 colonne") rappresentano i timestep di RNN. I tuoi dati vengono elaborati da . Dopo aver fornito i dati a RNN, ora ha 700 output che sono da a , non da a . Ricorda che ora la forma dei tuoi dati è che è campioni (le righe) x timesteps (le colonne) x canali .t=1 to 700h1h700h1h200N×700×200

Quindi, quando applichi a TimeDistributedDense, stai applicando un Denselivello su ogni timestep, il che significa che stai applicando un Denselivello su ogni , , ..., rispettivamente. Il che significa: in realtà stai applicando l'operazione completamente connessa su ciascuno dei suoi canali (quello "200"), rispettivamente, da a . Il primo " " fino al 700 ° " ".h1h2hth1h7001×1×2001×1×200

Perché stiamo facendo questo? Perché non si desidera appiattire l'output RNN.

Perché non appiattire l'uscita RNN? Perché vuoi mantenere separati i valori di ogni timestep.

Perché mantenere separati i valori di ogni timestep? Perché:

  • vuoi solo interagire i valori tra il proprio timestep
  • non vuoi avere un'interazione casuale tra diversi timestep e canali.

Quindi, quando applichi un TimeDistributedDense, stai applicando un livello Denso su ogni timestep -> Ciò significa che ogni timestep condivide il peso del livello Dense? Con il livello Denso non si applica solo all'ultimo timestep?
o0omycomputero0o

2
Perché TimeDistributedDense non è usato nell'esempio di Keras su blog.keras.io/… ?
user1934212

Perché TimeDistributedDense è già obsoleto. Da Keras 2.0, Dense è in grado di gestire bene il tensore bidimensionale
rilut
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.