【问题标题】:CNN keras hand written recognition has high accuracy but poor predictionsCNN keras手写识别准确率高但预测差
【发布时间】:2021-05-15 00:32:27
【问题描述】:

我基本上是为一个学校项目做这个,并按照一些指南使用 CNN 制作神经元网络。我使用的库是 cv2、NumPy、TensorFlow 和 matplotlib。我目前面临的问题是我的网络具有很高的准确性但预测非常糟糕。我确保图片是倒置的并且是 28x28。我还将要预测的图像数量从 5 个扩展到 10 个。我还尝试添加更多层,但也没有帮助。如果有人可以帮助我,那就太棒了!我对此也很陌生,所以请尽可能解释清楚!

输出示例:As you can see, the hand-writing isn't bad or anything but it still can't predict that it's a 6 but a 1.

Here is the Epoch with an accuracy of 99% basically

代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf


mnist = tf.keras.datasets.mnist
(a_train, b_train), (a_test, b_test) = mnist.load_data()

 a_train = tf.keras.utils.normalize(a_train, axis=1)
 a_test = tf.keras.utils.normalize(a_test, axis=1)
 model = tf.keras.models.Sequential()
 model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
 model.add(tf.keras.layers.Dense(units=255, activation=tf.nn.relu))
 model.add(tf.keras.layers.Dense(units=255, activation=tf.nn.relu))
 model.add(tf.keras.layers.Dense(units=20, activation=tf.nn.softmax))



 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

 model.fit(a_train, b_train, epochs=50)

 lost, accuracy = model.evaluate(a_train, b_train)
 print(lost)
 print(accuracy)

 model.save('test.model')

for x in range(1,11):
 img = cv2.imread(fr'C:\Users\Eric\PycharmProjects\pythonProject2\test.model\{x}.png')[:,:,0]
 img = np.invert(np.array([img]))
 prediction = model.predict(img)
 print(f'My Guess is: {np.argmax(prediction)}')
 plt.imshow(img[0], cmap=plt.cm.binary)
 plt.show()

我尝试做的事情: 我尝试添加更多层,假设它会训练并有更好的预测。 我添加了更多的样本数量,看看我是否可以有更高的预测。我从 5 上升到 10,但仍然是 20% 的正确预测。 我已经尝试改变 Epoch 并尝试更多的批量大小,但也没有用。

我几乎被困在这一点上,尽我所能去理解它,但根本无法改进它。如果有人有任何提示,请告诉我!

【问题讨论】:

  • 确保在预测时标准化您的图像。此外,您当前的代码不是 CNN,因为它不使用任何卷积层
  • 没有 CNN,你只是匹配原始像素,并且 mnist 居中。你的最后一层也应该包括 10 个单位而不是 20 个?

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

您需要在预测时对图像进行标准化。 cv2.imread 创建一个从 0 到 255 的数组。您可以通过将 img 除以 255. 来对其进行归一化

您用来预测的图像也应该在黑色背景上有白色文本。

最后,您不需要np.invert

所以你的代码应该是

for x in range(1, 11):
     img = np.expand_dims(cv2.imread(f'C:\Users\Eric\PycharmProjects\pythonProject2\test.model\{x}.png')[:, :, 0], 0) / 255.
     prediction = model.predict(img)
     print(f'My Guess is: {np.argmax(prediction)}')
     plt.imshow(img[0], cmap=plt.cm.binary)
     plt.show()

【讨论】:

  • 所以我照你说的做了。我已将示例编号更改为带有白色文本的黑色背景。在我提供的 10 张样本图片中,它仍然只有 50% 的预测。识别 7、6、9 之类的数字真的很糟糕。有没有办法解决这个问题?是否可以让网络训练更多?我仍然有 97% 的准确率,但预测正确率为 50%。
  • 一种可能是您的模型过度拟合。尝试将 epoch 的数量从 50 减少到 5 或 10。您还可以尝试在展平之前添加卷积层。这将使网络对稍微偏离中心的图像更具弹性
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2017-10-28
  • 2019-05-30
  • 2020-06-11
  • 2020-03-31
相关资源
最近更新 更多