Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Can I create an LSTM where the input data and the target data are asymmetric?

Input data : x.shape = (500, 20, 1)

Target data: y.shape = (500, 5, 1)

I create the following model:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

model = Sequential()
model.add(LSTM(units = 64, input_shape=(20, 1), return_sequences = True))
model.add(Dense(units=1))
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=1)

but I get this error:

ValueError: Dimensions must be equal, but are 20 and 5 for '{{node mean_absolute_error/sub}} = Sub[T=DT_FLOAT](sequential/dense/BiasAdd, IteratorGetNext:1)' with input shapes: [1,20,1], [1,5,1].

Is there a way around this?

>Solution :

If you are using return_sequences=True, y also has to have the same number of timesteps. This is what is causing the mismatch since x has 20 and y 5. You have a few options to experiment with:

Option 1:

You could try using tf.keras.layers.RepeatVector:

import tensorflow as tf

x = tf.random.normal(((500, 20, 1)))
y = tf.random.normal(((500, 5, 1)))
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units = 64, input_shape=(20, 1), return_sequences = False))
model.add(tf.keras.layers.RepeatVector(5))
model.add(tf.keras.layers.Dense(units=1))
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=1)

Option 2:

You could use return_sequences=True and a Conv1D layer to downsample the timesteps:

x = tf.random.normal(((500, 20, 1)))
y = tf.random.normal(((500, 5, 1)))
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units = 64, input_shape=(20, 1), return_sequences = True))
model.add(tf.keras.layers.Conv1D(32, 16))
model.add(tf.keras.layers.Dense(units=1))
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=1000, batch_size=1)

Option 3:

You could use tf.keras.layers.Flatten() and then reshape your tensor to have the correct output shape:

x = tf.random.normal(((500, 20, 1)))
y = tf.random.normal(((500, 5, 1)))
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(units = 64, input_shape=(20, 1), return_sequences = True))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(5))
model.add(tf.keras.layers.Reshape(y.shape[1:]))
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use