Python CNN keras手写识别准确率高,但预测能力差

Python CNN keras手写识别准确率高,但预测能力差,python,tensorflow,keras,deep-learning,conv-neural-network,Python,Tensorflow,Keras,Deep Learning,Conv Neural Network,我基本上是为了一个学校项目而做的,并遵循一些指南使用CNN制作了一个神经元网络。我使用的库有cv2、NumPy、TensorFlow和matplotlib。我目前面临的问题是,我的网络具有很高的准确性,但预测非常糟糕。我确保图片是反向的,并且是28x28。我还将图像数量从5个扩展到10个。我还尝试添加更多层,但也没有帮助。如果有人能帮我,那就太棒了!我对此也很陌生,所以请尽你所能解释清楚 输出示例: 代码如下: import cv2 import numpy as np import matp

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

输出示例:

代码如下:

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%的预测是正确的。 我尝试改变了大约一个时代,尝试了更多的批量大小,但也没有成功


我几乎被困在这一点上,尽我最大的努力去理解它,但根本无法改进它。如果有人有任何建议,请告诉我

在预测时,您需要对图像进行规格化
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()

在预测时,请确保对图像进行规格化。此外,您当前的代码不是CNN,因为它不使用任何卷积层。没有CNN,您只需匹配原始像素,mnist居中。你的最后一层应该包括10个单位而不是20个单位?所以我照你说的做了。我已将样本编号更改为带白色文本的黑色背景。在我给出的10张样本图片中,它仍然只有50%的预测。识别像7、6、9这样的数字真的很困难。有办法解决这个问题吗?有没有可能让网络进行更多培训?我仍然有97%的准确率,但有50%的预测正确。一种可能是你的模型拟合过度。尝试将纪元数从50个减少到5或10个。您还可以尝试在展平之前添加卷积层。这将使网络对稍微偏离中心的图像更有弹性