You need to enable JavaScript to run this app. 如何解决Keras多分类任务训练时每个epoch准确率恒定不变的问题
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Keras多分类任务训练时每个epoch准确率恒定不变的问题

核心错误原因

1. 输出层配置完全不符合11分类任务要求

你当前所有版本的代码输出层都设置为Dense(1, activation='softmax'),11分类任务需要输出层神经元数和类别数一致,也就是11个神经元,softmax会输出11个类别的概率分布,才能和标签计算损失、反向传播更新参数。你现在输出单个神经元加softmax,输出结果永远固定为1,网络没有有效梯度可以更新,自然不会有学习效果。

2. 损失函数和标签格式不匹配

categorical_crossentropy要求标签是one-hot编码后的11维向量,如果你的标签是0-10的整数形式,应该改用sparse_categorical_crossentropy,否则损失计算完全错误,网络无法学习。


修正后的代码示例

如果你的标签是整数格式(没有做one-hot编码,y_train.shape为(样本数,)):

# 定义模型
model1 = keras.Sequential()
model1.add(keras.layers.Dense(64, input_dim=14, activation='relu'))
model1.add(keras.layers.Dense(128, activation='relu'))
model1.add(keras.layers.Dense(64, activation='relu'))  
# 输出层改为11个神经元对应11个类别
model1.add(keras.layers.Dense(11, activation='softmax'))
# 损失函数改用适配整数标签的sparse_categorical_crossentropy
model1.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练
performance1 = model1.fit(x_train, y_train, epochs=100, validation_split=0.2)

如果你的标签已经做了one-hot编码(y_train.shape为(样本数,11)),只需要把输出层改成11个神经元即可,损失函数可以保留categorical_crossentropy。


后续验证注意点

  • 训练前先打印y_train.shape确认标签格式,保证和损失函数匹配
  • 可以先跑5-10个epoch验证损失是否下降、准确率是否变化,再调整epoch数
  • 如果训练后期出现过拟合,再加dropout层、调整神经元数量等操作即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:27:02