¿Arquitectura LSTM en la implementación de Keras?

Soy nuevo en Keras y estoy revisando la LSTM y sus detalles de implementación en la Keras documentation . Fue fácil, pero de repente pasé por esta publicación de SO y el comentario. Me ha confundido en lo que es la architecture LSTM real:

Aquí está el código:

 model = Sequential() model.add(LSTM(32, input_shape=(10, 64))) model.add(Dense(2)) 

Según mi entendimiento, 10 denota el no. de pasos de tiempo y cada uno de ellos se alimenta a su respectiva LSTM cell ; 64 denota el no. de características para cada paso del tiempo.

Pero, el comentario en la publicación anterior y la respuesta real me han confundido sobre el significado de 32.

Además, cómo se conecta la salida de LSTM a la capa Dense .

    Una explicación esquemática dibujada a mano sería muy útil para visualizar la architecture.

    EDITAR :

    En lo que respecta a esta otra publicación SO , entonces significa que 32 representa la longitud del vector de salida que produce cada una de las LSTM cells si return_sequences=True .

    Si eso es cierto, ¿cómo conectamos cada salida de 32 dimensiones producida por cada una de las 10 células LSTM a la siguiente capa densa?

    Además, por favor díganos si la primera respuesta de SO post es ambigua o no.

    ¿Cómo conectamos cada salida de 32 dimensiones producida por cada una de las 10 celdas LSTM a la siguiente capa densa?

    Depende de cómo quieras hacerlo. Supongamos que usted tiene:

     model.add(LSTM(32, input_shape=(10, 64), return_sequences=True)) 

    Entonces, la salida de esa capa tiene forma (10, 32) . En este punto, puede usar una capa Flatten para obtener un solo vector con 320 componentes, o usar un TimeDistributed para trabajar en cada uno de los 10 vectores de forma independiente:

     model.add(TimeDistributed(Dense(15)) 

    La forma de salida de esta capa es (10, 15) , y se aplican los mismos pesos a la salida de cada unidad LSTM.

    Es fácil descifrar el no. de celdas LSTM requeridas para la entrada (especificadas en el intervalo de tiempo)

    Cómo averiguar el no. de unidades LSTM requeridas en la salida?

    Puede obtener la salida de la última celda LSTM (último paso de tiempo) o la salida de cada celda LSTM, dependiendo del valor de return_sequences . En cuanto a la dimensionalidad del vector de salida, esa es solo una elección que tiene que hacer, al igual que el tamaño de una capa densa, o el número de filtros en una capa de conv.

    ¿Cómo se conecta cada uno de los 32-dim vector de las 10 células LSTM a la capa TimeDistributed?

    Siguiendo el ejemplo anterior, tendría un tensor (10, 32) , es decir, un vector de tamaño 32 para cada una de las 10 células LSTM. Lo que hace TimeDistributed(Dense(15)) , es crear una matriz de peso (15, 32) y un vector de polarización de tamaño 15, y hacer:

     for h_t in lstm_outputs: dense_outputs.append( activation(dense_weights.dot(h_t) + dense_bias) ) 

    Por lo tanto, dense_outputs tiene tamaño (10, 15) , y se aplicaron los mismos pesos a cada salida LSTM, de forma independiente .

    Tenga en cuenta que todo sigue funcionando cuando no sabe cuántos pasos de tiempo necesita, por ejemplo, para la traducción automática. En este caso, utiliza None para el paso de tiempo; todo lo que escribí sigue siendo válido, con la única diferencia de que el número de pasos de tiempo ya no está resuelto. Keras repetirá LSTM, TimeDistributed, etc. tantas veces como sea necesario (lo que dependerá de la entrada).