【问题标题】:CNN - Confusion Matrix wrong displayCNN - 混淆矩阵错误显示
【发布时间】:2020-03-09 09:10:11
【问题描述】:

我在 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 类,那么您得到的混淆矩阵是完全有效的。
  • 是的,但是 100% 分类良好的问题的混淆矩阵应该是对角的。如果你检查代码,准确率是 9.84 % 这真的很糟糕,这就是为什么我想知道代码是否写得好,以便得到正确的对角矩阵和正确的准确度估计。
  • @user115376 如果某个答案解决了您的问题,请点击答案分数下方的灰色勾号将其标记为已接受

标签: python deep-learning nlp conv-neural-network confusion-matrix


【解决方案1】:

我检查了您的代码,并为您的问题找到了解决方案。混淆矩阵的计算尽可能好。问题是您的网络根本没有学习,它将所有数据分类为 0。您可以通过在 fit 函数中将详细参数设置为 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)

你应该对你的测试集做同样的事情。

【讨论】:

  • 准确地说,9.84%的准确率是因为当你把所有的东西都归为0类时,你只能得到0类正确。这是4132 / 42000 = 0.0984。 :)
  • 我尝试对训练子样本进行归一化,但仍然无法正常工作...
  • @user115376 我刚刚又检查了一遍。规范化有帮助,我已经对您的存储库进行了分叉,并使用笔记本的更新版本提出了拉取请求,实际上工作正常。请检查一下。
  • 是的,现在我看到并运行了它,它运行良好。除了标准化之外,我不知道我做错了什么。我将更深入地研究代码。再次感谢。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2015-09-18
  • 2018-11-22
  • 2020-09-10
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多