Keras调用fit()后损失不变化且准确率始终为0问题求助
问题解决方案
核心错误1:输出层激活函数不匹配任务类型
你正在做连续数值预测的回归任务,但输出层误用了仅适合多分类场景的softmax激活函数:
model.add(keras.layers.Dense(1, activation="softmax"))
softmax的作用是将多个输出神经元的结果归一化为总和为1的概率分布,当仅存在1个输出神经元时,运算后的值会固定为1,这就是所有预测结果全为1、损失全程无变化的根本原因。
修复方式:
回归任务输出层不需要激活函数,直接输出原始数值即可,修改为:
model.add(keras.layers.Dense(1))
如果预测值有明确的数值范围约束,也可根据实际场景选择sigmoid、relu等激活函数,禁止使用softmax。
核心错误2:评估指标选择错误
accuracy是分类任务专属的评估指标,要求预测值和真实值完全相等才会计为正确,对于回归任务的连续值输出,几乎不可能满足相等条件,因此你观测到的准确率恒为0属于指标选择错误导致的正常现象,不是模型训练问题。
修复方式:
编译模型时替换为回归任务常用的评估指标即可,比如平均绝对误差MAE:
model.compile(loss="mse", optimizer=optimizer, metrics=["mae"])
可选优化建议
- 若序列规律和时序关联度高,可以将全连接层替换为LSTM、GRU等时序专用网络层,拟合效果会更好
- 数据归一化操作需要先拆分训练集、验证集、测试集,再仅用训练集拟合
StandardScaler,之后用拟合好的scaler去归一化验证集和测试集,不要提前对全量数据做归一化,会造成数据泄露 - 输入层的全连接层可以显式声明输入维度,避免Keras自动推断异常:
model.add(keras.layers.Dense(5, input_shape=(5,)))
内容的提问来源于stack exchange,提问作者radkal2
相关产品推荐
相关产品推荐

