我在Keras中使用CNN训练了一个手写数字多类分类模型。我试图使用相同的训练图像评估模型,以获得算法的准确性评估;但是,当我评估CNN混淆矩阵时,它只给出一列形式:
[[4132 0 0 0 0 0 0 0 0 0]
[4684 0 0 0 0 0 0 0 0 0]
[4177 0 0 0 0 0 0 0 0 0]
[4351 0 0 0 0 0 0 0 0 0]
[4072 0 0 0 0 0 0 0 0 0]
[3795 0 0 0 0 0 0 0 0 0]
[4137 0 0 0 0 0 0 0 0 0]
[4401 0 0 0 0 0 0 0 0 0]
[4063 0 0 0 0 0 0 0 0 0]
[4188 0 0 0 0 0 0 0 0 0]]
我想算法给出的结果是正确的,因为这些是数据库中每个数字的总数;但是,混淆矩阵应该给出如下内容:
[[4132 0 0 0 0 0 0 0 0 0]
[ 0 4684 0 0 0 0 0 0 0 0]
[ 0 0 4177 0 0 0 0 0 0 0]
[ 0 0 0 4351 0 0 0 0 0 0]
[ 0 0 0 0 4072 0 0 0 0 0]
[ 0 0 0 0 0 3795 0 0 0 0]
[ 0 0 0 0 0 0 4137 0 0 0]
[ 0 0 0 0 0 0 0 4401 0 0]
[ 0 0 0 0 0 0 0 0 4063 0]
[ 0 0 0 0 0 0 0 0 0 4188]]
The code is in this link
The data can be taken from the "train.csv" file in this Kaggle project.
我想问你们我在代码中做错了什么,所以我得到了这个奇怪的结果。
最佳答案
我检查了你的代码,找到了解决你问题的方法。混淆矩阵的计算也尽可能地有效。问题是您的网络根本没有学习,它将所有数据分类为0。您可以通过在fit函数中将verbose参数设置为1来验证这一点,然后您可以观察到大约10%的精确度,这相当于随机猜测。
model.fit(X_train, Y_train, epochs=100, batch_size=32, validation_data=(X_train, Y_train), verbose=1)
这是因为你没有规范化你的数据。您所要做的就是将数据集除以255,使数值在[0;1]范围内,然后一切正常工作,网络正在学习。
X_train = X.reshape((-1, 28, 28, 1))
X_train = X_train / 255.0
Y_train = to_categorical(Y)
你应该对你的测试集做同样的事情。
关于python - CNN-混淆矩阵错误显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58839334/