关于多元时间序列预测模型的问题 - keras

数据挖掘 Python 深度学习 喀拉斯 张量流 时间序列
2022-02-23 14:21:53

我无法理解我正在尝试创建的模型。
我有几个问题,所以我将首先解释我的模型以及我正在尝试做的事情:


我已经创建了数据序列(模型的输入和输出)每个 7 个时间步长,因此输入将是某一周的天的值,输出是下一周天的值(** 所以我的输入 1模型的输入形状为 (7,1) 与输出**) 相同。
我还准备了另一个输入列表,其中包含一些额外的功能,例如**下周**的假期标志和天气状况,因此模型的第二个 input2 具有每个示例的形状 (7,7)。
这是完整的模型摘要:

完整的模型摘要

在 lstm 层和完全连接的 NN 之后,我尝试将两个输入连接在一起,基本上,我想连接input2到 layer 的输出dense_1所以我将 (7,1) 形状与input_2形状 (7,7) 的第二个输入“”连接起来

我的问题:

1-密集层的输出让我感到困惑,我认为它们的形状是(无,单位数),但它们似乎是(无,7,单位数)总是有第二维“7”,我不明白。

致密层

2-对于连接部分,由于我将 7x7 输入添加到 7x1 输入中,因此我期望有 49+7=56 个单元连接到下一个密集层,但参数的数量告诉我情况并非只有 14 个*120+120=1800

连接

3-我想在最后一层有 7 个单位(每天预测 1 个),但必须将其设为 1,以便输出 (7,1) 并使其工作,我显然缺少一些东西.

第三个问题

这是模型定义的代码:

input1 = tf.keras.layers.Input(shape=(7,1),name="input_1")
x = tf.keras.layers.Conv1D(120, kernel_size=5,strides=1,activation="relu",
                           padding="causal",input_shape=[7, 1])(input1)
x = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(210, return_sequences=True),name="LSTM_1")(x)
x = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(210, return_sequences=True,name="LSTM_2"))(x)
x = tf.keras.layers.Dense(60,activation="relu",name="dense_1_1")(x)
x = tf.keras.layers.Dense(30,activation="relu",name="dense_1_2")(x)
x = tf.keras.layers.Dense(7,name="dense_1_3")(x)

input2 = tf.keras.layers.Input(shape=(7,7),name="input_2")
concat = tf.keras.layers.concatenate([x, input2],name="concat_1")
x = tf.keras.layers.Dense(120,activation="selu",name="dense_2_1")(concat)
x = tf.keras.layers.Dense(90,activation="selu",name="dense_2_2")(x)
x = tf.keras.layers.Dense(60,activation="selu",name="dense_2_3")(x)
output = tf.keras.layers.Dense(1)(x)

model = tf.keras.Model([input1, input2], output)

这些是输入(输入 1 和输入 2)和输出的维度

方面

1个回答

来自 Keras 文档: https ://keras.io/api/layers/core_layers/dense/

输入形状

ND 张量的形状:(batch_size, ..., input_dim). 最常见的情况是带有 shape 的 2D 输入(batch_size, input_dim)

输出形状

ND 张量的形状:(batch_size, ..., units). 例如,对于具有 shape 的 2D 输入(batch_size, input_dim),输出将具有 shape (batch_size, units)

如果层的输入的秩大于 2,则 Dense 沿输入的最后一个轴和内核的轴 1 计算输入和内核之间的点积(使用 tf.tensordot)。例如,如果输入的维度为 (batch_size, d0, d1),那么我们创建一个形状为 (d1, units) 的内核,并且内核沿输入的轴 2 对形状 (1, 1) 的每个子张量进行操作, d1) (有 batch_size * d0 这样的子张量)。在这种情况下,输出将具有形状 (batch_size, d0, units)。

的输入dense_1_1(None, 7, 420)密集层将应用于[:,i,:] for in 1..7输入的每个切片,产生大小为(None, 7, 60)

如果您期望输出具有形状(None, 60),则可以将输入重新整形,(None, 420*7)但在这种情况下这没有意义,因为您希望将密集层应用于输入的每个时间片。