提问者:小点点

X,y形状不同的Tensorflow keras时序预测


我尝试用tensorflow和keras做时间序列预测,xy具有不同的维度:

X.shape = (5000, 12)
y.shape = (5000, 3, 12)

当我执行以下操作时

n_input = 7
generator = TimeseriesGenerator(X, y, length=n_input, batch_size=1)

for i in range(5):
    x_, y_ = generator[i]
    print(x_.shape)
    print(y_.shape)

我得到了所需的输出

(1, 7, 12)
(1, 3, 12)
(1, 7, 12)
(1, 3, 12)
...

这是因为我的数据是气象的,我有5000天,为了在数组x中训练,我使用了7天的滑动窗口,每一天包含12个特征(气压,温度,湿度a.O.)。 并且在目标数组y中,我有3天的滑动窗口,尝试预测未来3天到7天的每个窗口。

但是,当我尝试拟合模型时,由于xy数组的形状不匹配,我得到了一个错误:

model = Sequential()
model.add(LSTM(4, input_shape=(None, 12)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit_generator(generator, epochs=3).history

ValueError: A target array with shape (1, 3, 12) was passed for an output of shape (None, 1) while using as loss `mean_squared_error`. This loss expects targets to have the same shape as the output.

那么,有没有一种方法来调整架构,以解决尺寸不匹配的问题呢? 或者有没有一种方法来重塑xy,使它们与这种体系结构一起工作? 我尝试了后期将x重新成形为(5000,7,12),但这也给出了一个维数错误。 TNX


共2个答案

匿名用户

你的发电机是正确的。。。 是你的关系网不起作用。

你没有正确处理维度。 您正在处理序列,因此需要在LSTM单元格中强加return_sequences=true。 您的输入有7个时间步骤,而您的输出有3个时间步骤,您必须从7个传递到3个(您可以通过池等方式来完成)。

下面是一个虚拟示例。 我没有使用池操作,而是简单地选择序列的一部分,以获得3个时间步骤的输出

X = np.random.uniform(0,1, (5000, 12))
y = np.random.uniform(0,1, (5000, 3, 12))

n_input = 7
generator = tf.keras.preprocessing.sequence.TimeseriesGenerator(X, y, length=n_input, batch_size=32)

model = Sequential()
model.add(LSTM(4, return_sequences=True, input_shape=(n_input, 12)))
model.add(Lambda(lambda x: x[:,-3:,:]))
model.add(Dense(12))
model.compile(loss='mean_squared_error', optimizer='adam')

model.summary()

model.fit(generator, epochs=2)

匿名用户

最终(完全连接)层的形状是(无,1),输出的形状是(无,3,12)。 数据的输出形状必须与网络相匹配。

我将使用函数API并创建3个单独的密集层,并将它们连接起来。 像这样:

inp = tf.keras.Input(shape=(7, 12))
x = tf.keras.layers.LSTM(4)(inp)

y1 = tf.keras.layers.Dense(12)(x)
y2 = tf.keras.layers.Dense(12)(x)
y3 = tf.keras.layers.Dense(12)(x)

y1 = tf.keras.backend.expand_dims(y1, axis=1)
y2 = tf.keras.backend.expand_dims(y2, axis=1)
y3 = tf.keras.backend.expand_dims(y3, axis=1)

y = tf.keras.layers.Concatenate(axis=1)([y1, y2, y3])

mdl = tf.keras.Model(inp, y)
mdl.summary()

返回:模型摘要