Как добиться создания окон и перетасовки в модели тензорного потока с двумя входами и двумя выходами?

#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 утра).