CNN模型训练报错:Shapes (None,1)与(None,15)不兼容
问题排查与解决
错误原因
报错核心是标签形状与模型输出形状不匹配:
- 模型最后一层是
Dense(15, activation='softmax'),输出形状为(None, 15),对应15类的概率分布 - 你传入的
y_train/y_test是形状为(None, 1)的类别索引(比如0-14的整数) - 而你使用的
categorical_crossentropy损失函数要求标签是one-hot编码格式(每个样本对应15维向量,仅目标类别位置为1,其余为0),因此形状不兼容导致报错
两种解决办法(二选一即可)
办法1:将标签转换为one-hot编码
使用Keras工具函数把一维类别索引转成二维one-hot向量:
from tensorflow.keras.utils import to_categorical # 转换训练和测试标签 y_train = to_categorical(y_train, num_classes=15) y_test = to_categorical(y_test, num_classes=15) # 执行训练(原模型编译代码不变) cnn_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_data=(x_test, y_test))
办法2:更换损失函数为sparse_categorical_crossentropy
该损失函数专门适配一维类别索引的多分类任务,无需修改标签:
# 编译模型时替换损失函数 cnn_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 直接使用原标签训练 cnn_model.fit(x_train, y_train, epochs=10, batch_size=64, validation_data=(x_test, y_test))
内容的提问来源于stack exchange,提问作者Ghulam Mujtaba Adil
相关产品推荐
相关产品推荐

