#python #tensorflow #keras #time-series #windowing
Вопрос:
Я анализирую ежедневное энергопотребление стиральной машины. Мой набор данных состоит из 4 столбцов, а именно:
- Метка времени Unix
- совокупное энергопотребление всех устройств в доме
- Энергопотребление стиральной машины
- Двоичные данные ( 0, когда стиральная машина была выключена, и 1, когда она была включена).
Unix
и aggregate
должны быть входами, в то время power
как и binary
должны быть выходами. Я передаю все эти функции в виде отдельных массивов numpy.
Вот моя модель:
import tensorflow as tf
from tensorflow.keras import Input, Model
input1 = tf.keras.layers.Input(shape=(None, ))
input2 = tf.keras.layers.Input(shape=(None,))
inputs= tf.keras.layers.Concatenate(axis=1)([input1, input2])
inputs = tf.keras.layers.Reshape((-1,2))(inputs)
x = tf.keras.layers.Conv1D(filters=16, kernel_size=3, strides=1, padding="causal", activation="relu",input_shape=[None,2,1])(inputs)
x = tf.keras.layers.Bidirectional(tf.keras.layers.GRU(128, activation="tanh", return_sequences=True))(x)
x = tf.keras.layers.Bidirectional(tf.keras.layers.GRU(256, activation="tanh", return_sequences=True))(x)
x = tf.keras.layers.Dense(128, activation="tanh")(x)
o1 = tf.keras.layers.Dense(1, activation="linear",name="ed")(x)
o2 = tf.keras.layers.Dense(1, activation="sigmoid",name="sd")(x)
model = Model(inputs=[input1,input2], outputs=[o1, o2])
model.compile(loss={'ed': 'mean_squared_error',
'sd': 'binary_crossentropy'},
optimizer='adam',
metrics={'ed': tf.keras.metrics.MeanSquaredError(name="mean_squared_error", dtype=None),
'sd': tf.keras.metrics.BinaryCrossentropy(name="binary_crossentropy", dtype=None, from_logits=False, label_smoothing=0)})
Поскольку это чистый анализ временных рядов , необходимы окна и перетасовка. Но я не знаю , как это сделать с несколькими входами и выходами.
Обычно это код, который большинство людей используют для перетасовки и создания окон:
def windowed_dataset(series, window_size, batch_size, shuffle_buffer):
series = tf.expand_dims(series, axis=-1)
ds = tf.data.Dataset.from_tensor_slices(series)
ds = ds.window(window_size 1, shift=1, drop_remainder=True)
ds = ds.flat_map(lambda w: w.batch(window_size 1))
ds = ds.shuffle(shuffle_buffer)
ds = ds.map(lambda w: (w[:-1], w[1:]))
return ds.batch(batch_size).prefetch(1)
Я не понимаю, как это можно использовать для нескольких входов и выходов.
Комментарии:
1. В качестве примечания, вы не должны предоставлять
timestamp
данные в качестве входных данных для модели. Вместо этого вы должны иметь последовательностьpower
, расположенную в соответствии с ихtimestamp
. Следовательно, у вас будет только один вход, который представляет собой последовательность совокупного использования энергии.2. @ShubhamPanchal если бы я сделал это, я бы не смог получить прогнозируемое потребление энергии за определенный период времени (скажем, 9-11 утра).