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

2024-04-19 01:10:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在训练一个预测股价的模型,输入的数据是收盘价。我使用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: Error when checking target: expected dense_1 to have 3 dimensions, but got array with shape (118, 1)

然而,Iprint数据的形状,它们是:

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

我不知道为什么当yúu列为(118,1)时,模型会期望三维输出。我错在哪里?我该怎么办?


Tags: 数据模型addtruemodelreturntrain特征
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)

所以你的输出是shape(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是批大小。

训练数据的格式应为:(num_samples,num_features,num_signals/num_vectors)。 按照此约定,尝试以数组的形式传递训练数据,该数组的大小按上述约定重塑,并确保在model.fit命令中添加validation_data参数。例如:

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

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

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

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

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

相关问题 更多 >