web-dev-qa-db-fra.com

Quel est le rôle de la couche TimeDistributed dans Keras?

J'essaie de comprendre ce que fait le wrapper TimeDistributed dans Keras.

Je comprends que TimeDistributed "applique un calque à chaque tranche temporelle d'une entrée".

Mais j'ai expérimenté et obtenu des résultats incompréhensibles.

En bref, en ce qui concerne la couche LSTM, les couches TimeDistributed et Just Dense produisent les mêmes résultats.

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add(TimeDistributed(Dense(1)))
print(model.output_shape)

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add((Dense(1)))
print(model.output_shape)

Pour les deux modèles, j'ai obtenu une forme de sortie de (Aucun, 10, 1).

Quelqu'un peut-il expliquer la différence entre les couches TimeDistributed et Dense après une couche RNN?

43
Buomsoo Kim

Dans keras - lors de la création d'un modèle séquentiel - généralement la deuxième dimension (une après la dimension de l'échantillon) - est liée à une dimension time. Cela signifie que si, par exemple, vos données sont 5-dim Avec (sample, time, width, length, channel), Vous pouvez appliquer une couche convolutionnelle à l'aide de TimeDistributed (applicable à 4-dim Avec (sample, width, length, channel)) Le long d'une dimension temporelle (en appliquant le même calque à chaque tranche temporelle) afin d'obtenir une sortie 5-d.

Le cas de Dense est que, dans keras à partir de la version 2.0, Dense s’applique par défaut à la dernière dimension uniquement (par exemple, si vous appliquez Dense(10) à la saisie avec shape (n, m, o, p) vous obtiendrez une sortie avec shape (n, m, o, 10)), donc dans votre cas Dense et TimeDistributed(Dense) sont équivalents.

43
Marcin Możejko