Error when checking model input: expected lstm_1_input to have 3 dimensions, but got array with shape (339732, 29)

Saurav-- picture Saurav-- · Jun 22, 2017 · Viewed 67.3k times · Source

My input is simply a csv file with 339732 rows and two columns :

  • the first being 29 feature values, i.e. X
  • the second being a binary label value, i.e. Y

I am trying to train my data on a stacked LSTM model:

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)

This throws the error:

Traceback (most recent call last): File "first_approach.py", line 80, in model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

ValueError: Error when checking model input: expected lstm_1_input to have 3 dimensions, but got array with shape (339732, 29)

I tried reshaping my input using X_train.reshape((1,339732, 29)) but it did not work showing error:

ValueError: Error when checking model input: expected lstm_1_input to have shape (None, 8, 29) but got array with shape (1, 339732, 29)

How can I feed in my input to the LSTM ?

Answer

Saurav-- picture Saurav-- · Jun 22, 2017

Setting timesteps = 1 (since, I want one timestep for each instance) and reshaping the X_train and X_test as:

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]))

This worked!