You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python神经网络股票预测数据预处理方法与训练报错排查

问题诊断与解决方法

一、初始报错原因

你最开始遇到的Conv2DCustomBackpropFilterOp only supports NHWC报错是因为Windows环境下TensorFlow的GPU算子默认仅支持*通道最后(channels_last)*的输入格式,你后续把data_format参数修改为channels_last的操作是正确的。

二、单样本训练问题的根源

你现在遇到的模型将整个训练集识别为单个样本的问题,完全是由以下两行错误代码导致的:

df_edu_train = np.expand_dims(df_edu_train,axis=0)
df_edu_train_out = np.expand_dims(df_edu_train_out,axis=0)

神经网络输入的第一个维度默认是样本数,你在axis=0的位置新增维度后,原本形状为(训练样本数, 特征数)的数据集被改成了(1, 训练样本数, 特征数),模型自然会认为你只有1个训练样本。

另外你当前还存在数据维度不符合Conv1D要求的问题:你把50天的每日特征直接拼接成了一维的250维向量,Conv1D需要输入的形状为(样本数, 时序长度, 特征数),无法直接处理拉平的时序特征。

三、修复步骤

1. 调整数据集构造逻辑

删除上述两行新增维度的代码,同时将拉平的特征恢复为时序结构:

# 原来的normalize后新增reshape操作,50天,每天5个特征(Open/High/Low/Close/Volume)
df_edu_train = normalize(df_edu_train.values).reshape(-1, days_edu, 5)
df_edu_val = normalize(df_edu_val.values).reshape(-1, days_edu, 5)
# 输出标签不需要时序结构,保持(N,25)即可,对应未来5天*5个特征
df_edu_train_out = normalize(df_edu_train_out.values)
df_edu_val_out = normalize(df_edu_val_out.values)

2. 修改模型输入配置

将Conv1D层的input_shape调整为匹配时序输入的格式,不需要写样本数:

model.add(Conv1D(filters=32, kernel_size=5, padding="same", strides=1, input_shape=(days_edu,5)))

3. 额外的预处理优化建议

你当前使用的normalize是对单个样本做L2归一化,如果你需要做特征级的标准化(更适合时序预测场景),可以替换为StandardScaler,注意拟合时仅使用训练集数据,避免数据泄露:

scaler = StandardScaler()
# 仅用训练集拟合scaler
df_edu_train = scaler.fit_transform(df_edu_list[:int(len(df_edu_list)*0.8)])
# 验证集直接用训练集的scaler转换
df_edu_val = scaler.transform(df_edu_list[int(len(df_edu_list)*0.8):])

4. 训练样本说明

你构造的df_edu_list里每一行本身就是一个独立的训练样本,对应一组「过去50天数据->未来5天数据」的映射,调整维度后模型会自动按行读取为独立样本训练。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:45:08