Python 如何为时间序列的RNN双向层定义输入_形状

Python 如何为时间序列的RNN双向层定义输入_形状,python,input,keras,recurrent-neural-network,Python,Input,Keras,Recurrent Neural Network,我试图为时间序列预测构建一个RNN,但我似乎不知道如何为双向层指定输入形状(输入形状需要是输入形状(win_sz,3))。任何帮助都将不胜感激。:) 我使用的是Keras 2.x版 我的代码: model = tf.keras.models.Sequential([ tf.keras.layers.Bidirectional( tf.keras.layers.LSTM(32, activation = 'sigmoid', return_seque

我试图为时间序列预测构建一个RNN,但我似乎不知道如何为双向层指定输入形状(输入形状需要是输入形状(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'])

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

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

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

  • 批次维度-批次中的样本数
  • 时间维度-表示数据的时间方面(例如天数)
  • Input dimension—单个输入和单个时间步中的特征数
因此,输入是一个大小为
(批量大小、时间步长、输入大小)
的张量。现在让我们来看一个例子

import tensorflow as tf
import numpy as np

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

定义输入形状 因此,在定义输入形状时,只需定义时间维度和输入维度。您可以省略批次维度,因为这将由Keras处理。因此,您的
输入\u shape=(30,10)

现在你可以用上面的玩具数据来尝试这个模型

model.fit(dummy_in, dummy_out)

如果你把这个形状放进去会怎么样?非常感谢,这很有帮助。然而,我一直遇到同样的问题。当我使用数据“forecast=model.predict(x_valid)”时,我不断得到以下错误:ValueError:检查输入时出错:预期双向_输入有3个维度,但得到了具有形状的数组(526,3)。同样,您没有提供3D输入。输入x_valid需要是(批量大小、时间步长、输入大小)张量。
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)