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
Dense
capa que aplana la entrada y luego la reforma, por lo tanto, conecta diferentes pasos de tiempo y tiene más parámetros, yTimeDistributed
mantiene los pasos de tiempo separados (por lo tanto, tiene menos parámetros). En su caso,Dense
debería haber tenido 500 parámetros,TimeDistributed
solo 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 unatime
dimensión. Esto significa que si, por ejemplo, sus datos están5-dim
con(sample, time, width, length, channel)
, podría aplicar una capa convolucional usandoTimeDistributed
(que es aplicable a4-dim
con(sample, width, length, channel)
) a lo largo de una dimensión de tiempo (aplicando la misma capa a cada segmento de tiempo) para obtener5-d
resultados.El caso con
Dense
es quekeras
desde la versión 2.0Dense
se 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 casoDense
yTimeDistributed(Dense)
son equivalentes.fuente
Input
tensor, ¿hay alguna diferencia con esto en comparación con simplemente hacer una partemap
del modelo aplicado a una lista que contiene cada porción de laInput
?