因此,我用来自keras的示例训练数据训练了我的神经网络,然后用我自己的手写数字涂装它。
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
path = 'C:/Users/pewdu/Desktop/three.png'
img = cv2.imread(path)
new_img = cv2.resize(img, (28, 28))
new_img = new_img[:,:,0] / 255.0 # Take only first channel and normalize
new_img = np.expand_dims(new_img, axis=0) # Adding the dimension
print(new_img.shape) # it equals to (1, 28, 28)
prediction = model.predict(new_img)
问题在于,无论我输入的数字是多少,都会给出错误的预测(总是只有一个固定数字)。例如,如果我给它编号3,它将响应为5,如果我给它编号另一个,它也会响应5。尽管它可以正确地用于示例测试数据。
我还认为问题可能在于我的手指与示例训练数据有不同的背景。我的照片发黄。 That's the image of my pictures
答案 0 :(得分:4)
您似乎需要反转图像。原始图像的数字像素值较高,但似乎图像中的背景涂成黑色,数字涂成白色。您需要反转图形的颜色,只需将黑色更改为白色,将白色更改为黑色。
答案 1 :(得分:0)
您错误地预处理了输入数据。
MNIST是二进制数据集,因此像素值在[0,255]范围内,并且只能采用值0或255。您的网络了解到了这一点。
为了正确输入图像,您必须对输入图像进行二值化处理,使其与模型经过训练的图像相似。
您可以使用OpenCV进行操作,以灰度读取图像并应用阈值设置:
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
new_img = cv2.resize(img, (28, 28)) # already single channel
# get a binary image white number, black background
new_img, _ = cv2.threshold(new_img, 127, 255, cv2.THRESH_BINARY_INV)
new_img = new_img / 255. # normalize and make it float
new_img = np.expand_dims(new_img, axis=0) # Adding the batch dimension