【发布时间】:2021-05-14 07:21:50
【问题描述】:
我正在尝试使用 TensorFlow 的 keras 神经网络来识别手写数字。但是我知道为什么当我调用predict() 时,它会为所有输入图像返回相同的结果。
代码如下:
### Train dataset ###
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train/255
x_test = x_test/255
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
model.add(tf.keras.layers.Dense(units=128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(units=10,activation=tf.nn.softmax))
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5)
结果如下:
Epoch 1/5
1875/1875 [==============================] - 2s 672us/step - loss: 0.2620 - accuracy: 0.9248
Epoch 2/5
1875/1875 [==============================] - 1s 567us/step - loss: 0.1148 - accuracy: 0.9658
Epoch 3/5
1875/1875 [==============================] - 1s 559us/step - loss: 0.0784 - accuracy: 0.9764
Epoch 4/5
1875/1875 [==============================] - 1s 564us/step - loss: 0.0596 - accuracy: 0.9817
Epoch 5/5
1875/1875 [==============================] - 1s 567us/step - loss: 0.0462 - accuracy: 0.9859
那么使用图像进行测试的代码如下:
img = cv.imread('path/to/1.png')
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img = cv.resize(img,(28,28))
img = np.array([img])
if cv.countNonZero((255-image)) == 0:
print('')
img = np.invert(img)
plt.imshow(img[0])
plt.show()
prediction = model.predict(img)
result = np.argmax(prediction)
print(prediction)
print(f'Result: {result}')
结果是:
[[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
Result: 3
[[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
Result: 3
【问题讨论】:
-
在预测
img = np.invert(img)时,您正在反转您的图像,而原始数据集的数字值较高(因此黑色背景(0)上的白色数字(1))。同样img/255。在测试图像上/在预测时执行与训练图像相同的处理。 -
我看到如果我删除第二个
img = np.invert(img),它会返回准确百分比的预测,但是如果删除所有img = np.invert(img),它会给出所有错误 -
你在说什么第二个
np.invert(img)?只有一个。cv.countNonZero((255-image))不会反转您所说的实际图像 -
我再次检查了我的代码并看到了第二个
np.invert(img),但cv.countNonZero((255-image))仅用于检查图像是否为空白背景。 :D -
@HungDang 你能就给定的答案(更新部分)提供一些反馈吗?
标签: python tensorflow keras neural-network handwriting-recognition