0

我正在尝试为时间序列预测构建 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'])
4

1 回答 1

0

好的,所以我认为你应该多读一点关于时间序列输入在 Keras 中的样子。但是为了帮助您,让我演示如何在一个玩具示例中使用您的模型。

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

时间序列输入

时间序列输入(通常)是具有以下维度的 3D 输入。

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

所以输入是一个张量 size (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)
于 2019-11-17T10:57:28.777 回答