Error al verificar la entrada del modelo: se esperaba que lstm_1_input tuviera 3 dimensiones, pero tenía una matriz con forma (339732, 29)

Mi entrada es simplemente un archivo csv con 339732 filas y dos columnas:

  • El primero es 29 valores de características, es decir, X
  • el segundo es un valor de etiqueta binaria, es decir, Y

Estoy tratando de entrenar mis datos en un modelo LSTM astackdo:

data_dim = 29 timesteps = 8 num_classes = 2 model = Sequential() model.add(LSTM(30, return_sequences=True, input_shape=(timesteps, data_dim))) # returns a sequence of vectors of dimension 30 model.add(LSTM(30, return_sequences=True)) # returns a sequence of vectors of dimension 30 model.add(LSTM(30)) # return a single vector of dimension 30 model.add(Dense(1, activation='softmax')) model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) model.summary() model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1) 

Esto arroja el error:

Seguimiento (última llamada más reciente): archivo “first_approach.py”, línea 80, en model.fit (X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

ValueError: error al verificar la entrada del modelo: se esperaba que lstm_1_input tuviera 3 dimensiones, pero tenía una matriz con forma (339732, 29)

    Intenté reformular mi entrada usando X_train.reshape((1,339732, 29)) pero no funcionó con un error:

    ValueError: error al verificar la entrada del modelo: se esperaba que lstm_1_input tuviera forma (Ninguno, 8, 29) pero que tenía una matriz con forma (1, 339732, 29)

    ¿Cómo puedo ingresar mi entrada al LSTM?

    Estableciendo timesteps = 1 (ya que quiero un timestep para cada instancia) y remodelando X_train y X_test como:

     import numpy as np X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1])) X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1])) 

    ¡Esto funcionó!

    Para timesteps != 1 , puede usar la siguiente función (adaptada de aquí )

     import numpy as np def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back+1): a = dataset[i:(i+look_back), :] dataX.append(a) dataY.append(dataset[i + look_back - 1, :]) return np.array(dataX), np.array(dataY) 

    Ejemplos

     X = np.reshape(range(30),(3,10)).transpose() array([[ 0, 10, 20], [ 1, 11, 21], [ 2, 12, 22], [ 3, 13, 23], [ 4, 14, 24], [ 5, 15, 25], [ 6, 16, 26], [ 7, 17, 27], [ 8, 18, 28], [ 9, 19, 29]]) create_dataset(X, look_back=1 ) (array([[[ 0, 10, 20]], [[ 1, 11, 21]], [[ 2, 12, 22]], [[ 3, 13, 23]], [[ 4, 14, 24]], [[ 5, 15, 25]], [[ 6, 16, 26]], [[ 7, 17, 27]], [[ 8, 18, 28]], [[ 9, 19, 29]]]), array([[ 0, 10, 20], [ 1, 11, 21], [ 2, 12, 22], [ 3, 13, 23], [ 4, 14, 24], [ 5, 15, 25], [ 6, 16, 26], [ 7, 17, 27], [ 8, 18, 28], [ 9, 19, 29]])) create_dataset(X, look_back=3) (array([[[ 0, 10, 20], [ 1, 11, 21], [ 2, 12, 22]], [[ 1, 11, 21], [ 2, 12, 22], [ 3, 13, 23]], [[ 2, 12, 22], [ 3, 13, 23], [ 4, 14, 24]], [[ 3, 13, 23], [ 4, 14, 24], [ 5, 15, 25]], [[ 4, 14, 24], [ 5, 15, 25], [ 6, 16, 26]], [[ 5, 15, 25], [ 6, 16, 26], [ 7, 17, 27]], [[ 6, 16, 26], [ 7, 17, 27], [ 8, 18, 28]], [[ 7, 17, 27], [ 8, 18, 28], [ 9, 19, 29]]]), array([[ 2, 12, 22], [ 3, 13, 23], [ 4, 14, 24], [ 5, 15, 25], [ 6, 16, 26], [ 7, 17, 27], [ 8, 18, 28], [ 9, 19, 29]])) 

    Reformar la entrada para LSTM:

     X = array([[10, 20, 30], [40, 50, 60], [70, 80, 90]]) X_train = X.reshape(1, 3, 3) # X.reshape(samples, timesteps, features)