Keras多分类训练出现(None,1)与(None,6)形状不兼容报错如何解决
报错核心原因
- 标签与损失函数要求的格式不匹配:你当前使用的
categorical_crossentropy损失函数要求输入的标签为独热编码格式,维度为(样本数, 类别数),也就是对应你的6分类任务,y_train的形状应该是(None, 6),但你当前传入的y_train是整数编码格式,形状为(None, 1),二者维度不匹配触发报错。 - 隐藏层激活函数使用错误:中间全连接层使用
softmax作为激活函数不符合模型设计逻辑,softmax会将层输出压缩为和为1的概率分布,会导致中间层特征信息大量丢失,严重影响模型训练效果。
解决方案
- 标签适配方案(无需修改标签数据,操作最简单):将损失函数替换为
sparse_categorical_crossentropy,该损失函数原生支持整数格式的标签,不需要做独热编码转换,仅需修改编译代码即可:
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
- 标签转换方案:如果需要保留原
categorical_crossentropy损失函数,可将标签转换为独热编码格式:
from tensorflow.keras.utils import to_categorical y_train = to_categorical(y_train, num_classes=6) # 若存在验证集/测试集,对应标签也需要做相同转换
- 模型结构优化(必做,否则模型精度会极低):将中间隐藏层的激活函数全部替换为
relu,仅保留最后输出层的softmax激活,修改后的模型结构如下:
model = Sequential() model.add(Dense(50, input_dim = 561, activation = 'relu')) model.add(Dense(100, activation = 'relu')) model.add(Dense(150, activation = 'relu')) model.add(Dense(75, activation = 'relu')) model.add(Dense(50, activation = 'relu')) model.add(Dense(6, activation = 'softmax'))
内容的提问来源于stack exchange,提问作者talhamasood0000
相关产品推荐
相关产品推荐

