如何为时间序列的RNN的BiDirectional层定义input_shape

时间:2019-11-17 05:30:42

标签: python input keras recurrent-neural-network

我正在尝试为时间序列预测构建RNN,但似乎无法弄清楚如何为双向层指定input_shape(input_shape需要为input_shape(win_sz,3))。任何帮助将非常感激。 :)

我正在使用Keras 2.x版

我的代码:


   model = tf.keras.models.Sequential([
          tf.keras.layers.Bidirectional(
          tf.keras.layers.LSTM(32, activation = 'sigmoid', return_sequences=False, input_shape=(None))),
          tf.keras.layers.Dense(1, activation='linear')])

    lr_schedule = tf.keras.callbacks.LearningRateScheduler(lambda epoch: 1e-8 * 10**(epoch/20))

    sgd = tf.keras.optimizers.SGD(lr=1e-8, momentum=.91, clipvalue=0.5)
    model.compile(loss=tf.keras.losses.mean_squared_error,
             optimizer=sgd,
             metrics=['mse'])

1 个答案:

答案 0 :(得分:0)

好的,所以我认为您应该多读一些有关Keras中时间序列输入的外观的信息。但是为了帮助您一路走来,让我演示如何在玩具示例中使用您的模型。

但是在直接研究示例之前,让我解释一下什么是时间序列输入。

时间序列输入

时间序列输入通常是具有以下尺寸的3D输入。

  • 批次尺寸-批次中的样本数
  • 时间维度-代表数据的时间方面(例如天数)
  • 输入维度-单个输入和单个时间步的特征数

因此,输入是大小为(batch size, timesteps, input size)的张量。现在让我们转到示例。

import tensorflow as tf
import numpy as np

b_size = 5
timesteps = 30
in_size = 10

因此,使用这些值,我可以创建一个虚拟输入(5、30、10)和一个虚拟输出(5、1)。

dummy_in = np.random.normal(size=(b_size, timesteps, in_size))
dummy_out = np.random.normal(size=(b_size, 1))

定义输入形状

因此,在定义输入形状时,只需定义时间维和输入维。您将忽略批次尺寸,因为Keras将处理该尺寸。因此,您的input_shape=(30, 10)

model = tf.keras.models.Sequential([
          tf.keras.layers.Bidirectional(
          tf.keras.layers.LSTM(32, activation = 'sigmoid', return_sequences=False, input_shape=(timesteps, in_size))),
          tf.keras.layers.Dense(1, activation='linear')])

lr_schedule = tf.keras.callbacks.LearningRateScheduler(lambda epoch: 1e-8 * 10**(epoch/20))

sgd = tf.keras.optimizers.SGD(lr=1e-8, momentum=.91, clipvalue=0.5)
model.compile(loss=tf.keras.losses.mean_squared_error,
          optimizer=sgd,
          metrics=['mse'])

现在您可以使用上面的玩具数据尝试该模型。

model.fit(dummy_in, dummy_out)