gogasca
gogasca

Reputation: 10048

Keras LSTM input shape error for input shape

I'm getting this error when using Time Series with Keras:

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

This is my function:

def CreateModel(shape):
  """Creates Keras Model.

  Args:
    shape: (set) Dataset shape. Example: (31,3).

  Returns:
    A Keras Model.

  Raises:
    ValueError: Invalid shape
  """

  if not shape:
    raise ValueError('Invalid shape')

  logging.info('Creating model')
  model = Sequential()
  model.add(LSTM(4, input_shape=(31, 3)))
  model.add(Dense(1))
  model.compile(loss='mean_squared_error', optimizer='adam')
  return model

Main code:

print(training_features.shape)
model = CreateModel(training_features.shape)
model.fit(
      training_features,
      training_label,
      epochs=FLAGS.epochs,
      batch_size=FLAGS.batch_size,
      verbose=FLAGS.keras_verbose_level)

Complete error:

Traceback (most recent call last):
  File "<embedded module '_launcher'>", line 149, in run_filename_as_main
  File "<embedded module '_launcher'>", line 33, in _run_code_in_main
  File "model.py", line 300, in <module>
    app.run(main)
  File "absl/app.py", line 433, in run
    _run_main(main, argv)
  File "absl/app.py", line 380, in _run_main
    sys.exit(main(argv))
  File "model.py", line 274, in main
    verbose=FLAGS.keras_verbose_level)
  File "keras/models.py", line 960, in fit
    validation_steps=validation_steps)
  File "keras/engine/training.py", line 1581, in fit
    batch_size=batch_size)
  File "keras/engine/training.py", line 1414, in _standardize_user_data
    exception_prefix='input')
  File "keras/engine/training.py", line 141, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (31, 3)

Code originally from here

I have tried:

training_features = numpy.reshape(
      training_features,
      (training_features.shape[0], 1, training_features.shape[1]))

But I get:

ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4

Upvotes: 2

Views: 1534

Answers (1)

bivouac0
bivouac0

Reputation: 2560

If your original data is (31,3) then I think what you're looking for is a training_features.shape = (31,3,1). You can get that with the following line...

training_features = training_features.reshape(-1, 3, 1)

This will simply add a new axis to the existing data (the -1 just tells numpy to figure out this dimension using the values in the original data).

You also need to fix your model's input shape. The 31 should be the number of samples in your data. This doesn't get included in the Keras input_shape parameter. You should be using...

model.add(LSTM(4, input_shape=(3, 1)))

Keras will automatically set the batch size to None meaning that any number of samples will work with the model.

Upvotes: 4

Related Questions