¿Cuál es el papel de la capa TimeDistributed en Keras?

82

Estoy tratando de comprender qué hace el contenedor TimeDistributed en Keras.

Entiendo que TimeDistributed "aplica una capa a cada segmento temporal de una entrada".

Pero hice un experimento y obtuve resultados que no puedo entender.

En resumen, en relación con la capa LSTM, TimeDistributed y solo la capa Dense dan los mismos resultados.

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)

Para ambos modelos, obtuve una forma de salida de (Ninguno, 10, 1) .

¿Alguien puede explicar la diferencia entre la capa distribuida en el tiempo y la capa densa después de una capa RNN?

Buomsoo Kim
fuente
1
Actualmente ssem no hay diferencia, aquí una discusión al respecto. Creo que la intención original era hacer una distinción entre la Densecapa que aplana la entrada y luego la reforma, por lo tanto, conecta diferentes pasos de tiempo y tiene más parámetros, y TimeDistributedmantiene los pasos de tiempo separados (por lo tanto, tiene menos parámetros). En su caso, Densedebería haber tenido 500 parámetros, TimeDistributedsolo 50
gionni
@gionni No, tiene el mismo número de parámetros (ambos 6). Entonces, ¿prácticamente no hay diferencia en un cajero automático?
Buomsoo Kim
Sí, exactamente, esa es la cantidad de parámetros que tendrían si hubiera una diferencia. Por el momento no hay
gionni

Respuestas:

82

En keras, mientras se construye un modelo secuencial, generalmente la segunda dimensión (una después de la dimensión de muestra), está relacionada con una timedimensión. Esto significa que si, por ejemplo, sus datos están 5-dimcon (sample, time, width, length, channel), podría aplicar una capa convolucional usando TimeDistributed(que es aplicable a 4-dimcon (sample, width, length, channel)) a lo largo de una dimensión de tiempo (aplicando la misma capa a cada segmento de tiempo) para obtener 5-dresultados.

El caso con Densees que kerasdesde la versión 2.0 Densese aplica de forma predeterminada solo a la última dimensión (por ejemplo, si aplica Dense(10)a la entrada con forma (n, m, o, p), obtendrá una salida con forma (n, m, o, 10)), por lo que en su caso Densey TimeDistributed(Dense)son equivalentes.

Marcin Możejko
fuente
3
Hay un ejemplo del uso de TimeDistributed envolviendo el modelo en sí. Cuando esto se aplica a un Inputtensor, ¿hay alguna diferencia con esto en comparación con simplemente hacer una parte mapdel modelo aplicado a una lista que contiene cada porción de la Input?
CMCDragonkai