使用Tensorflow/Keras训练神经网络遇精度过低与输出异常问题求助
问题分析与修复方案
核心问题拆解
你的方案存在几个关键错误,直接导致模型输出异常、"精度"指标无意义:
- 输出层激活函数误用:sigmoid函数输出范围固定在(0,1),但你的任务是回归预测(目标Y是1000、500这类大正数值),模型输出被强制压缩到0-1区间,
np.round后自然只有0或1,完全不符合任务需求。 - 用错评价指标:
accuracy是分类任务的指标,用来衡量类别匹配度,对你的回归任务来说毫无参考价值,3%的"精度"不代表模型真实性能。 - 数据未做预处理:X和Y都是大数值范围的数据,神经网络对数据尺度敏感,未归一化/标准化会导致训练时梯度不稳定,难以收敛到有效解。
- 优化器选择不合适:SGD的固定学习率对这类回归任务不够友好,不如自适应学习率的优化器容易收敛。
具体修复步骤
替换输出层激活函数
把输出层的sigmoid换成线性激活(Keras中Dense层默认就是linear,无需显式指定);如果目标Y全为正数,也可以用relu或softplus避免输出负数:model.add(tensorflow.keras.layers.Dense(102)) # 默认linear激活 # 可选:确保输出非负 -> model.add(tensorflow.keras.layers.Dense(102, activation='relu'))更换回归任务专属评价指标
去掉accuracy,改用MAE(平均绝对误差)、MSE(均方误差)等回归指标:model.compile(loss='mean_absolute_percentage_error', optimizer='Adam', metrics=['mean_absolute_error', 'mean_squared_error'])数据归一化/标准化处理
用sklearn的缩放工具对X和Y分别处理,消除数据尺度差异:from sklearn.preprocessing import StandardScaler # 处理输入特征X scaler_X = StandardScaler() X_train_scaled = scaler_X.fit_transform(X_train) X_dev_scaled = scaler_X.transform(X_dev) # 处理目标值Y scaler_Y = StandardScaler() Y_train_scaled = scaler_Y.fit_transform(Y_train) Y_dev_scaled = scaler_Y.transform(Y_dev) # 用缩放后的数据训练 model.fit(X_train_scaled, Y_train_scaled, epochs=100, batch_size=32, verbose=1) # 预测后反缩放得到真实数值 predictions_scaled = model.predict(X_dev_scaled) predictions = scaler_Y.inverse_transform(predictions_scaled)优化训练配置
- 把优化器从
SGD换成Adam,自适应学习率能让模型更快收敛; - 适当增加epochs(比如100-200),观察损失曲线直到损失稳定;
- 如果模型欠拟合,可增加网络复杂度:比如加一层
Dense(128, activation='relu'),或降低Dropout比例(当前模型偏简单,0.2的Dropout可能过度抑制)。
- 把优化器从
修正预测后的数据处理
不需要对预测结果做np.round(i, 0),直接保存反缩放后的连续数值即可。
关于模型适用性
神经网络完全适用于你的任务——既然线性回归能取得不错效果,说明数据存在线性关联,而神经网络可以拟合更复杂的非线性关系,只要配置正确,性能不会弱于线性回归,甚至可能更好。
内容的提问来源于stack exchange,提问作者devnewdevv
相关产品推荐
相关产品推荐

