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

Deu*_*eus 10 python output lstm keras

我正在训练一个模型来预测股票价格,而输入数据是收盘价。我使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

X_train:(118, 45, 2)
y_train:(118, 1)
Run Code Online (Sandbox Code Playgroud)

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

nur*_*ric 8

您的第二个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)
Run Code Online (Sandbox Code Playgroud)

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

# (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)
Run Code Online (Sandbox Code Playgroud)

然后,您将获得所需的输出。注意bs是批量大小。


Hel*_*len 5

我有一个类似的问题,在这里找到答案:

model.add(Flatten())在最后一个 Dense 层之前添加