MNIST模型即使训练和测试精度很高,也无法正确预测测试图像

时间:2019-08-14 06:37:10

标签: machine-learning keras mnist

我正在尝试创建一个可以预测手写数字的模型。我已经使用以下架构训练了Keras模型,并在测试过程中看到了近99%的准确性。但是,我决定从Internet上拍摄一些黑白数字的图片,并使用OpenCV将其尺寸最小化为28x28,以尝试使用经过训练的模型进行预测。测试完所有10位数字后,我的模型只能正确预测4/10,这意味着它的得分为40%。

为什么会发生这种情况,我该怎么解决?

这是我正在使用的MNIST数据集: https://www.kaggle.com/oddrationale/mnist-in-csv

以下是我正在测试的图像: https://drive.google.com/open?id=1G0CMK0ZPI1JIX2cYXNRt3Qsq_YpjlMjX

#architecture
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
#Code for minmizing
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.resize(img,(28,28))

#turning the 28x28 array into a (1, 28, 28, 1) numpy array for the model to process
#dividing each value by 255. During the training, each grayscale pixel value was treated the same way

for i in range(28):
    temp = []
    for x in range(28):
        temp.append([img[i][x]/255])
    pendo.append(temp)
img = np.array([pendo]).astype("float32")

#predicting the image
model = load_model('MNIST.h5')
classes = model.predict(img)

1 个答案:

答案 0 :(得分:3)

MNIST并不是要学习一个完全通用的数字识别模型的数据集,它只是一个学术基准,是一个非常古老的基准,因此使任何一种测试准确度接近99%都是非常容易的,并不意味着模型将完全泛化。

最后,这不是编程问题,应该明确,这不是代码问题,也不是数据问题。您拥有的图像与MNIST训练集中的图像完全不同。