如何解决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
相关产品推荐
相关产品推荐

