Hey guys I do need you! - For some reason, my model is getting a shape error!

Hey Guys,

I hope you are getting a beautiful day. I’m stuck with this error: TensorFlow.python.framework.errors_impl.InvalidArgumentError: Specified a list with shape [32,7] from a tensor with shape [17,7]

I can’t even understand what’s going on. I’ll leave my code down here and, hopefully, someone can help me in finding a solution (please run the code to have a look, it is pretty simple):

from turtle import shape
import urllib
import zipfile
import pandas as pd
import tensorflow as tf
import numpy as np

def download_and_extract_data():
    url = 'https://storage.googleapis.com/download.tensorflow.org/data/certificate/household_power.zip'
    urllib.request.urlretrieve(url, 'household_power.zip')
    with zipfile.ZipFile('household_power.zip', 'r') as zip_ref:
        zip_ref.extractall()

def normalize_series(data, min, max):
    data = data - min
    data = data / max
    return data

def windowed_dataset(series, batch_size, n_past=24, n_future=24, shift=1):
    ds = tf.data.Dataset.from_tensor_slices(series)
    ds = ds.window(size=n_past + n_future, shift=shift, drop_remainder=True)
    ds = ds.flat_map(lambda w: w.batch(n_past + n_future))
    ds = ds.map(lambda w: (w[:n_past], w[n_past:]))
    return ds.batch(batch_size).prefetch(1)

df = pd.read_csv('household_power_consumption.csv', sep=',',
                     infer_datetime_format=True, index_col='datetime', header=0)

N_FEATURES = len(df.columns)  # DO NOT CHANGE THIS

data = df.values
data = normalize_series(data, data.min(axis=0), data.max(axis=0))

SPLIT_TIME = int(len(data) * 0.5)  # DO NOT CHANGE THIS
x_train = data[:SPLIT_TIME]
x_valid = data[SPLIT_TIME:]

tf.keras.backend.clear_session()
tf.random.set_seed(42)

BATCH_SIZE = 32  # ADVISED NOT TO CHANGE THIS
N_PAST = 24  # DO NOT CHANGE THIS
N_FUTURE = 24  # DO NOT CHANGE THIS
SHIFT = 1  # DO NOT CHANGE THIS

train_set = windowed_dataset(series=x_train, batch_size=BATCH_SIZE,
                                 n_past=N_PAST, n_future=N_FUTURE,
                                 shift=SHIFT)


valid_set = windowed_dataset(series=x_valid, batch_size=BATCH_SIZE,
                                 n_past=N_PAST, n_future=N_FUTURE,
                                 shift=SHIFT)

model = tf.keras.models.Sequential([

        # ADD YOUR LAYERS HERE.

        # If you don't follow the instructions in the following comments,
        # tests will fail to grade your code:
        # The input layer of your model must have an input shape of:
        # (BATCH_SIZE, N_PAST = 24, N_FEATURES = 7)
        # The model must have an output shape of:
        # (BATCH_SIZE, N_FUTURE = 24, N_FEATURES = 7).
        # Make sure that there are N_FEATURES = 7 neurons in the final dense
        # layer since the model predicts 7 features.

        # HINT: Bidirectional LSTMs may help boost your score. This is only a
        # suggestion.

        # WARNING: If you are using the GRU layer, it is advised not to use the
        # recurrent_dropout argument (you can alternatively set it to 0),
        # since it has not been implemented in the cuDNN kernel and may
        # result in much longer training times.

    tf.keras.layers.InputLayer(input_shape=(N_PAST, N_FEATURES), batch_size = BATCH_SIZE, name='Input'),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(N_FEATURES, activation='relu', return_sequences=True)),
    tf.keras.layers.Dense(N_FEATURES)
])

optimizer = tf.keras.optimizers.Adam()

model.summary()

model.compile(
        optimizer=optimizer,
        loss='mae'
    )

model.fit(
        train_set,
        epochs = 5,
        validation_data = valid_set,
        steps_per_epoch = len(list(train_set.as_numpy_iterator())),
        validation_steps = len(list(valid_set.as_numpy_iterator())),
        batch_size =1

how many items do you have on your train_set?

you might have one last batch that is incomplete and has only 17 items, making the input you expect wrong.

1 Like

I would also recommend not using batch size argument in your model.fit method because your TF Dataset already creates the batches

1 Like

When taking batch_size off from that model’s part, I’m still getting the same result. May I ask you that run this model on your environment to identify exactly what is going on?

I think changing:

return ds.batch(batch_size).prefetch(1) to:
return ds.batch(batch_size, drop_remainder=True).prefetch(1)

and remove batch size in model.fit might fix your issue or something along those lines.

2 Likes

Hi @npalaciosv I had a similar situtation how did you resolve it ?