首页 文章

检查目标时出错:期望dense_1有3个维度,但是有形状的数组(118,1)

提问于
浏览
3

我正在训练模型来预测股票价格,输入数据是接近的价格 . 我使用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:检查目标时出错:期望dense_1有3个维度,但得到的数组有形状(118,1)

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

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

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

1 回答

  • 1

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

    # (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 是批量大小 .

相关问题