Keras多分类ANN训练报错:形状不兼容,求教Argmax使用方法
解决5分类ANN的形状不兼容错误
你遇到的ValueError: Shapes (None, 1) and (None, 5) are incompatible问题,核心原因是损失函数与标签格式不匹配:
- 输出层用
softmax激活后,输出形状是(None, 5)(对应5类的概率分布) - 但你的
y_train是单值整数标签(形状(None, 1)),而categorical_crossentropy要求标签必须是one-hot编码格式(形状(None, 5))
下面是两种直接可行的解决方法:
方法1:将标签转换为one-hot编码
用Keras的工具函数把整数标签转换成one-hot矩阵,步骤如下:
- 导入工具函数:
from keras.utils import to_categorical
- 处理训练集和测试集的标签:
# 假设y_train中的标签是0-4的整数 y_train_onehot = to_categorical(y_train, num_classes=5) y_test_onehot = to_categorical(y_test, num_classes=5)
- 训练时使用转换后的标签:
RD_Model = classifier.fit(X_train, y_train_onehot, batch_size=10, epochs=10, verbose=1)
预测时,用argmax从输出概率中提取类别:
import numpy as np y_pred_probs = classifier.predict(X_test) y_pred = np.argmax(y_pred_probs, axis=1)
方法2:改用sparse_categorical_crossentropy损失函数
如果不想修改标签格式,直接替换损失函数,它会自动适配整数标签:
classifier.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
之后直接用原标签训练即可:
RD_Model = classifier.fit(X_train, y_train, batch_size=10, epochs=10, verbose=1)
预测时同样用argmax提取类别:
import numpy as np y_pred_probs = classifier.predict(X_test) y_pred = np.argmax(y_pred_probs, axis=1)
两种方法效果等价,可根据需求选择。
内容的提问来源于stack exchange,提问作者Timothée D
相关产品推荐
相关产品推荐

