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