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
相关产品推荐
相关产品推荐

