Reputation: 10048
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
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