Comprender el parámetro input_shape en LSTM con Keras

20

Estoy tratando de usar el ejemplo descrito en la documentación de Keras llamada "Stacked LSTM para la clasificación de secuencia" (vea el código a continuación) y no puedo descifrar el input_shapeparámetro en el contexto de mis datos.

Tengo como entrada una matriz de secuencias de 25 posibles caracteres codificados en enteros a una secuencia acolchada de longitud máxima 31. Como resultado, mi x_traintiene el (1085420, 31)significado de la forma (n_observations, sequence_length).

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

En este código x_traintiene la forma (1000, 8, 16), como para una matriz de 1000 matrices de 8 matrices de 16 elementos. Allí me pierdo por completo en qué es qué y cómo mis datos pueden alcanzar esta forma.

Mirando el documento de Keras y varios tutoriales y preguntas y respuestas, parece que me falta algo obvio. ¿Alguien puede darme una pista de qué buscar?

Gracias por tu ayuda !

mazieres
fuente

Respuestas:

23

Las formas LSTM son resistentes, así que no te sientas mal, tuve que pasar un par de días luchando contra ellas:

Si va a alimentar datos 1 carácter a la vez, su forma de entrada debe ser (31,1) ya que su entrada tiene 31 pasos de tiempo, 1 carácter cada uno. Necesitará remodelar su x_train de (1085420, 31) a (1085420, 31,1), lo cual se hace fácilmente con este comando:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))
tRosenflanz
fuente
2

Consulte este diagrama de resumen del repositorio git LSTM Keras y creo que debería tener todo muy claro.

Este repositorio de git incluye un diagrama de resumen de Keras LSTM que muestra:

  • el uso de parámetros como return_sequences, batch_size, time_step...
  • la estructura real de las capas lstm
  • el concepto de estas capas en keras
  • cómo manipular sus datos de entrada y salida para que coincidan con los requisitos de su modelo cómo apilar las capas de LSTM

Y más

Mohammad Fneish
fuente
Gracias por eso, @MohammadFneish. Parece que sería más útil ahora. Sin embargo, no está claro que esta sea una respuesta a la pregunta , en lugar de una sugerencia útil. Tenga en cuenta que Cross Validated es estrictamente un sitio de preguntas y respuestas, no un foro. ¿Puede agregar [aún más] información para explicar el parámetro de forma de entrada?
gung - Reinstalar a Monica
3
@gung Realmente aprecio la forma en que está logrando revisar estas respuestas para mantener los estándares, pero creo que no puedo dar más detalles sobre estos parámetros, ya que hay muchos detalles técnicos al respecto. Solo creo que mi respuesta podría ser útil para los desarrolladores que enfrentan problemas similares con las entradas de Keras y no necesariamente este problema en particular. Gracias
Mohammad Fneish
1

Sé que no es una respuesta directa a tu pregunta. Este es un ejemplo simplificado con solo una celda LSTM, que me ayuda a comprender la operación de remodelación de los datos de entrada.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

Este sería un ejemplo de la red LSTM con solo una celda LSTM y con los datos de entrada de forma específica.

Como resultado, solo estamos prediciendo aquí, la capacitación no está presente por simplicidad, pero mira cómo necesitábamos remodelar los datos (para agregar una dimensión adicional) antes del predictmétodo.

prosti
fuente