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

3

我将尝试在一些时间序列集上运行一个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]。

我的网络出现了一种错误,说它希望输入为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个回答

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')

通过修改之后,我现在遇到了这个错误:检查目标时出错:期望dense_1的形状为(None, 930, 5),但得到的数组形状为(466, 930, 2) - WRosko
修改此行代码:model.add(Dense(2)) - Marcin Możejko
我会添加 BatchNormalization,然后尝试使用集合 [16, 32, 64, 128] 中的 batch_size。这是一个高度依赖数据的问题。 - Marcin Możejko
@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 的形状不同,我该如何拟合我的模型? - Petr Petrov
@PetrPetrov 你的数据形状不同...你需要具有相同的维度。你怎么可能有不同数量的输入和输出? - WRosko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接