我正在尝试在一个时间序列集上运行一个RNN/LSTM网络。需要提到的是,这些时间序列是进行分类处理的。我有大约600个不同的时间序列,每个时间序列有930个时间步,每个时间步内包含特征。我将数据结构化为一个三维的numpy数组,结构如下:
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 MinMaxScalerfrom sklearn.preprocessing import LabelEncoderfrom sklearn.metrics import mean_squared_errorfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.layers import BidirectionalTrain_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 tohave 2 dimensions, but got array with shape (466, 930, 2)
回答:
你的输出也具有序列性质。默认情况下,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')