我正在尝试创建一个能够预测手写数字的模型。我使用了下面的架构训练了一个Keras模型,并在测试过程中看到了接近99%的准确率。然而,我决定从互联网上下载一些黑白数字的图片,并使用OpenCV将它们的尺寸缩小到28×28,以尝试使用我的训练模型进行预测。在测试了所有10个数字后,我的模型仅正确预测了4/10,意味着它的得分只有40%。
为什么会发生这种情况?我能做些什么来解决这个问题?
我使用的MNIST数据集在这里:https://www.kaggle.com/oddrationale/mnist-in-csv
我测试的图片在这里:https://drive.google.com/open?id=1G0CMK0ZPI1JIX2cYXNRt3Qsq_YpjlMjX
#architecturemodel = 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 minmizingimg = 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 wayfor 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 imagemodel = load_model('MNIST.h5')classes = model.predict(img)
回答:
MNIST并不是一个用于学习完全通用数字识别模型的数据集,它只是一个学术基准,而且是一个非常古老的基准,因此获得接近99%的测试准确率非常容易,但这并不意味着模型具有任何泛化能力。
最终,这不是一个编程问题,这一点应该很清楚,不是代码的问题,而是数据的问题。你拥有的图像与MNIST训练集中的图像差异太大。