Hello. I posted this on SO a few weeks ago, but didn’t get any responses. I’m hoping some of you folks can help me.
I’m trying to create a model to forecast energy grid load (net electricity consumed by the grid) based on weather data. In production, we won’t have load data to do a standard batch prediction. We’re trying an autoregressive approach so that we can feed it the last reported load reading and the next 24 hours of forecasted weather data to produce a 24 (or 72, 168 etc) hour prediction of load.
I’m working from this tutorial, which recommends subclassing the model class to make a step by step prediction. I believe the model.fit documentation also recommends subclassing.
The above tutorial creates a subclass of keras.model called Feedback and overwrites the model.call() method, which is called during training and prediction.
def call(self, inputs, training=None):
# Use a TensorArray to capture dynamically unrolled outputs.
predictions = []
# Initialize the LSTM state.
prediction, state = self.warmup(inputs)
# Insert the first prediction.
predictions.append(prediction)
# Run the rest of the prediction steps.
for n in range(1, self.out_steps):
# Use the last prediction as input.
x = prediction
# Execute one lstm step.
x, state = self.lstm_cell(x, states=state,
training=training)
# Convert the lstm output to a prediction.
prediction = self.dense(x)
# Add the prediction to the output.
predictions.append(prediction)
# predictions.shape => (time, batch, features)
predictions = tf.stack(predictions)
# predictions.shape => (batch, time, features)
predictions = tf.transpose(predictions, [1, 0, 2])
return predictions
When calling fit(), I pass in datasets for training and validation. The datasets made via keras.utils.timeseries_dataset_from_array().
history = model.fit(dataset_train, epochs=epochs,
validation_data=dataset_val,
callbacks=[es_callback, modelckpt_callback])
My data shapes are hourly time series data, 11 columns of weather data and 1 column of targets. I’m using a window size of two hours.
My issue is that it seems as though the prediction calls in the for loop are only using previous predictions as input. I don’t understand how they could be accessing the training or validation datasets.
I tried looking around in the Pycharm debugger for a way to access the datasets, but didn’t find anything. I also tried looking for people doing similar subclassing, but this tutorial is the best I could find.
If a running example is needed, that tutorial goes through dataset creation and subclass implementation. My hope is that someone could explain how to properly subclass keras.model (in a similar fashion to that tutorial) to take multiple-column input, and do autoregressive predictions. The overwriting of the call() method is where I’m most confused.