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?
python
machine-learning
keras
neural-network
deep-learning
Buomsoo Kim
fuente
fuente

Densecapa que aplana la entrada y luego la reforma, por lo tanto, conecta diferentes pasos de tiempo y tiene más parámetros, yTimeDistributedmantiene los pasos de tiempo separados (por lo tanto, tiene menos parámetros). En su caso,Densedebería haber tenido 500 parámetros,TimeDistributedsolo 50Respuestas:
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 unatimedimensión. Esto significa que si, por ejemplo, sus datos están5-dimcon(sample, time, width, length, channel), podría aplicar una capa convolucional usandoTimeDistributed(que es aplicable a4-dimcon(sample, width, length, channel)) a lo largo de una dimensión de tiempo (aplicando la misma capa a cada segmento de tiempo) para obtener5-dresultados.El caso con
Densees quekerasdesde la versión 2.0Densese aplica de forma predeterminada solo a la última dimensión (por ejemplo, si aplicaDense(10)a la entrada con forma(n, m, o, p), obtendrá una salida con forma(n, m, o, 10)), por lo que en su casoDenseyTimeDistributed(Dense)son equivalentes.fuente
Inputtensor, ¿hay alguna diferencia con esto en comparación con simplemente hacer una partemapdel modelo aplicado a una lista que contiene cada porción de laInput?