检查目标时出错:预期density_1具有3维,但数组的形状为(118,1)

时间:2018-08-09 09:55:12

标签: python keras output lstm

我正在训练一个模型来预测股票价格,而输入数据为收盘价。我使用45天的数据来预测第46天的收盘价,而经济指标将成为第二个特征,这是模型:

model = Sequential()
model.add( LSTM( 512, input_shape=(45, 2), return_sequences=True))
model.add( LSTM( 512, return_sequences=True))
model.add( (Dense(1)))
model.compile(loss='mse', optimizer='adam')
history = model.fit( X_train, y_train, batch_size = batchSize, epochs=epochs, shuffle = False)

运行此命令时,出现以下错误:

  

ValueError:检查目标时出错:预期density_1具有3   尺寸,但数组的形状为(118,1)

但是,我print是数据的形状,它们是:

X_train:(118, 45, 2)
y_train:(118, 1)

我不知道为什么当y_train为(118,1)时模型期望3维输出。我在哪里错了,该怎么办?

3 个答案:

答案 0 :(得分:3)

您的第二个LSTM层也返回序列,默认情况下,密集层将内核应用于每个时间步并产生序列:

# (bs, 45, 2)
model.add( LSTM( 512, input_shape=(45, 2), return_sequences=True))
# (bs, 45, 512)
model.add( LSTM( 512, return_sequences=True))
# (bs, 45, 512)
model.add( (Dense(1)))
# (bs, 45, 1)

因此您的输出为(bs, 45, 1)形状。要解决该问题,您需要在第二个LSTM层中设置return_sequences=False,以压缩序列:

# (bs, 45, 2)
model.add( LSTM( 512, input_shape=(45, 2), return_sequences=True))
# (bs, 45, 512)
model.add( LSTM( 512, return_sequences=False)) # SET HERE
# (bs, 512)
model.add( (Dense(1)))
# (bs, 1)

您将获得所需的输出。注意bs是批处理大小。

答案 1 :(得分:0)

训练数据的形状应采用以下格式:(num_samples,num_features,num_signals/num_vectors)。 遵循此约定,尝试以上述约定的大小调整大小的数组形式传递训练数据,并确保在validation_data命令中添加model.fit自变量。一个例子是:

model.fit(x=X_input ,y=y_input,batch_size=2,validation_data=(X_output, y_output),epochs=10)

其中X_inputy_input都是形状分别为(126,711,1)和(126,1)的训练数据数组,而X_outputy_output是验证/测试分别具有形状(53,711,1)和(53,1)的数据数组。

如果您发现改组错误,请按照上述方法尝试将shuffle参数的值设置为True。

答案 2 :(得分:0)

我遇到了类似的问题,找到了答案here

我在最后一个密集层之前添加了model.add(Flatten())