You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Keras股价预测模型报错:输入样本与标签维度不匹配问题咨询

解决股价预测模型的维度不匹配问题

你的错误核心是模型输出维度和标签维度不匹配,而且完全不需要给标签补0(这会破坏标签的分类含义,是错误方向)。咱们一步步拆解问题和解决方案:

为什么会报错?

看你的错误信息:模型输出是[1,1,20],标签是[1,1,3],而CategoricalHinge损失函数要求预测值和标签的形状必须完全一致。导致输出维度不对的原因有两个:

  1. LSTM层设置了return_sequences=True,这会让LSTM返回每个时间步的输出(你的输入是(1,1,20),所以LSTM输出是(1,1,20));
  2. Dense层的dense_units应该设为3(对应你的3类标签),但看起来你可能设成了20,导致最终输出还是20维,和3维标签不匹配。

解决方案

根据你的任务(单样本对应一个分类结果:涨/跌/平),调整模型结构让输出维度和标签对齐:

1. 修改LSTM层的返回模式

因为你不需要每个时间步的输出,只需要最后一个时间步的结果来做分类,把return_sequences=True改成return_sequences=False,这样LSTM会输出(batch_size, 20)的张量(去掉时间步维度)。

2. 调整Dense层的单元数

dense_units设为3,对应你的3类独热编码标签,这样Dense层会输出(batch_size, 3)的张量,和标签维度匹配。

3. 处理标签的多余维度(如果需要)

如果你的标签y_train/y_test形状是(样本数,1,3),需要去掉中间的1维度,用np.squeeze()即可。

修改后的完整代码

import numpy as np
from tensorflow import keras

# 确保dense_units对应3类分类
dense_units = 3
dropout_rate = 0.2  # 可根据你的实际参数调整
learning_rate = 0.001
batch_size = 32
epochs = 50

inputs = keras.Input(shape=(x_train.shape[1], x_train.shape[2]))
# 关闭return_sequences,只返回最后一个时间步的输出
hidden = keras.layers.LSTM(x_train.shape[2], activation='tanh', return_sequences=False)(inputs)
dropout = keras.layers.Dropout(dropout_rate)(hidden)
# Dense输出3维,对应3类标签
output = keras.layers.Dense(dense_units, activation='softmax')(dropout)
model = keras.Model(inputs=inputs, outputs=output, name="financial_model")

# 处理标签的多余维度(如果y_train是(样本数,1,3)的话)
y_train = np.squeeze(y_train, axis=1)
y_test = np.squeeze(y_test, axis=1)

model.compile(
    loss=keras.losses.CategoricalHinge(),
    optimizer=keras.optimizers.Adam(learning_rate=learning_rate),
    metrics=["accuracy"],
)
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test,y_test))

额外说明

如果你的任务是序列标注(比如每个时间步都要预测股价走势),那需要保持return_sequences=True,同时把标签调整成(样本数,1,3)的形状,并且Dense层依然设为3。但从你的描述来看,股价预测通常是单步预测(用历史特征预测未来一个时间点的走势),所以上面的方案更适合你。

内容的提问来源于stack exchange,提问作者Fox

火山引擎 最新活动