keras LSTM模型中的尺寸不匹配

时间:2016-10-17 13:58:06

标签: python-3.x theano keras keras-layer

我想使用带有keras的LSTM神经网络来预测时间序列组,我在使模型与我想要的匹配方面遇到了麻烦。我的数据的维度是:

输入张量:(data length, number of series to train, time steps to look back)

输出张量:(data length, number of series to forecast, time steps to look ahead)

  

注意:我想保持尺寸完全相同,不   转置。

重现问题的虚拟数据代码是:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, TimeDistributed, LSTM

epoch_number = 100
batch_size = 20
input_dim = 4
output_dim = 3
look_back = 24
look_ahead = 24
n = 100

trainX = np.random.rand(n, input_dim, look_back)
trainY = np.random.rand(n, output_dim, look_ahead)
print('test X:', trainX.shape)
print('test Y:', trainY.shape)

model = Sequential()

# Add the first LSTM layer (The intermediate layers need to pass the sequences to the next layer)
model.add(LSTM(10, batch_input_shape=(None, input_dim, look_back), return_sequences=True))

# add the first LSTM layer (the dimensions are only needed in the first layer)
model.add(LSTM(10, return_sequences=True))

# the TimeDistributed object allows a 3D output
model.add(TimeDistributed(Dense(look_ahead)))

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, nb_epoch=epoch_number, batch_size=batch_size, verbose=1)

这个小道:

  

异常:检查模型目标时出错:预期   timedistributed_1具有形状(无,4,24)但具有形状的数组   (100,3,24)

问题似乎是在定义TimeDistributed图层时。

如何定义TimeDistributed层以便编译和训练?

2 个答案:

答案 0 :(得分:0)

在您的情况下,错误消息有点误导。您的网络输出节点称为timedistributed_1,因为它是顺序模型中的最后一个节点。该错误消息试图告诉您的是,此节点的输出与您的模型适合的目标不匹配,即您的标签trainY

您的trainY形状为(n, output_dim, look_ahead),因此(100, 3, 24)但网络的输出形状为(batch_size, input_dim, look_ahead)。这种情况下的问题是output_dim!= input_dim。如果时间维度发生变化,则可能需要填充或删除所述时间步长的网络节点。

答案 1 :(得分:0)

我认为问题是您希望在TimeDistributed的输出处output_dim(!= input_dim),但这是不可能的。这个维度被认为是 time 维度:它被保留。

  

输入应至少为3D,索引一维的尺寸将为   被认为是时间维度。

TimeDistributed的目的是将相同的图层应用于每个时间步。您最终只能使用与开始时相同的时间步长。

如果您确实需要将此维度从4降至3,我认为您需要在最后添加另一个图层,或者使用与TimeDistributed不同的图层。

PS:发现此问题的一个提示是在创建模型时从不使用output_dim,它只出现在验证数据中。虽然它只是一种代码味道(这种观察可能没有任何问题),但它值得检查。