使用 Keras、Tensorflow 进行具有多个时间序列维度的 RNN 时间序列预测

Posted

技术标签:

【中文标题】使用 Keras、Tensorflow 进行具有多个时间序列维度的 RNN 时间序列预测【英文标题】:RNN time series predictions with multiple time series dimension with Keras, Tensorflow 【发布时间】:2018-06-23 12:21:23 【问题描述】:

我正在尝试在一些时间序列集上运行 RNN/LSTM 网络。应该提到的是,时间序列正在被分类。我有大约 600 个不同的时间序列,每个都有 930 个时间步长,其中包含特征。我已将我的数据结构化为一个 numpy 3D 数组,其结构如下:

X = [666 observations/series, 930 timesteps in each observation, 15 features]
Y = [666 observations/series, 930 timesteps in each observation, 2 features]

对于训练和验证数据,我将数据拆分为 70/30。所以 Train_X = [466, 930, 15] 和 Train_Y = [200, 930, 2]。

我的网络收到一个错误,说它期望输入是二维的,并且它得到了一个形状为 (466, 930, 2) 的数组。我的代码如下:

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Bidirectional

Train_X = new_ped_data[0:466]
Test_X = new_ped_data[466:]

Train_Y = new_ped_valid_data[0:466]
Test_Y = new_ped_valid_data[466:]

model = Sequential()
model.add(Bidirectional(LSTM(20, return_sequences=True),
                        input_shape=Train_X.shape[1:]))
model.add(Bidirectional(LSTM(10)))
model.add(Dense(5))
model.compile(loss='mae', 
              optimizer='rmsprop')

model.fit(Train_X, Train_Y, epochs = 30, batch_size = 32, 
      validation_data =(Test_X, Test_Y))

我只是想让模型运行。完成后,我将调整架构和拟合参数。我应该提到,分类输出之一可能不是必需的。关于如何设置架构以便在输入时间序列时我将获得每个时间步的网络分类值的任何建议?

Error was: ValueError: Error when checking target: expected dense_9 to
have 2 dimensions, but got array with shape (466, 930, 2)

【问题讨论】:

【参考方案1】:

您的输出也具有顺序性。 LSTM 默认有一个标志 return_sequences=False。这会使您的序列在第二个LSTM 层之后被压缩为一个向量。为了改变这种尝试:

model = Sequential()
model.add(Bidirectional(LSTM(20, return_sequences=True),
                    input_shape=Train_X.shape[1:]))
model.add(Bidirectional(LSTM(10, return_sequences=True)))
model.add(Dense(5))
model.compile(loss='mae', 
          optimizer='rmsprop')

【讨论】:

嗯,我现在有了这个修改:Error when checking target: expected dense_1 to have shape (None, 930, 5) but got array with shape (466, 930, 2) 更改这一行:model.add(Dense(2)) 我会添加BatchNormalization,然后从[16, 32, 64, 128] 中尝试batch_size。这是高度依赖数据的问题。 @MarcinMożejko 我尝试使用您的代码,但我的数据形状为x_train=(117, 73742, 118), y_train=(117, 73744, 118), x_val=(13, 73742, 118), y_val=(13, 73744, 118),并且出现错误ValueError: Error when checking target: expected dense_14 to have shape (73742, 118) but got array with shape (73744, 118)。如果xy 的形状不同,我该如何适应我的模型? @PetrPetrov 您的数据形状不同...您需要具有相同的维度。你怎么可能有不同数量的输入和输出?

以上是关于使用 Keras、Tensorflow 进行具有多个时间序列维度的 RNN 时间序列预测的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keras、Tensorflow 进行具有多个时间序列维度的 RNN 时间序列预测

具有 padding='SAME' 的 Tensorflow/Keras Conv2D 层表现异常

具有Tensorflow后端的Keras的K.function方法是否适用于网络层?

具有Tensorflow后端的Keras - 运行在CPU上预测但适合GPU

如何使用 tensorflow 或 keras 重新训练具有新子集的线性回归模型?

Keras + Tensorflow 和 Python 中的多处理