Почему мои прогнозы нейронной сети правильны применительно к рукописным изображениям MNIST, но неверны применительно к моим собственно нарисованным изображениям? - PullRequest
2 голосов
/ 30 октября 2019

Фон:

Я пытаюсь создать базовую нейронную сеть для распознавания нарисованных от руки изображений с использованием набора данных MNIST. У меня есть вещи, которые работают при обучении / прогнозировании по данным MNIST.

Цель:

Я хотел бы начать применять модель к изображениям, не относящимся к MNIST (т. Е. Ручнымнарисованные изображения, которые я создаю сам).

Проблема:

Все прогнозы рисованных изображений, которые я создаю, оказались неверными (что странно, потому что прогнозы противТочные изображения MNIST на 95%).

Код:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import cv2

mnist = tf.keras.datasets.mnist # 28x28 images of handwritten digits (0-9)

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.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=3)

val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)

# prediction from MNIST dataset
index_of_mnist_img = 0
predictionsA = model.predict([x_test])
print(np.argmax(predictionsA[index_of_mnist_img]))
plt.imshow(x_test[index_of_mnist_img], cmap = plt.cm.binary)
plt.show()

# prediction from my own hand-drawn image (THIS IS WHERE THINGS START GOING WRONG)
img = cv2.imread('4.png')
img = cv2.resize(img, (28,28))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = np.reshape(img, [1,28,28])
predictionsB = model.predict(img)
print(np.argmax(predictionsB[0]))
plt.imshow(predictionsB[0])
plt.show()

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Я считаю, что вам нужно инвертировать цветовую карту для вашего нового (нарисованного от руки) изображения.

Когда я смотрю на примеры изображений MNIST, я вижу что-то вроде этого:

# show mnist image
index_of_mnist_img = 0
plt.imshow(x_test[index_of_mnist_img], cmap = plt.cm.binary)
plt.show()

7

Однако, если я сделаюНапример, рукописная цифра, и читать ее, как у вас, я вижу перевернутое изображение.

img = cv2.imread("4.png")
img = cv2.resize(img, (28,28))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img, cmap = plt.cm.binary)

4

Вы можете инвертировать изображение с помощьюOpenCV, добавив одну строку, cv2.bitwise_not().

img = cv2.imread(r"4.png")
img = cv2.resize(img, (28,28))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img= cv2.bitwise_not(img) # invert image
plt.imshow(img, cmap = plt.cm.binary)

4_inverted

Когда я инвертирую изображение, я получаю правильные прогнозы из нейронной сети, которую выОбучались выше.

predictionsB = model.predict(img)
print(np.argmax(predictionsB[0]))
4
1 голос
/ 30 октября 2019

Нужно ли задумываться о том, чтобы поезд / тест был создан. Этот тренинг может быть перегружен, с этим вы даете хорошую точность в поезде, но это не полностью с тестовыми данными.

Возможно также использование увеличения изображения для увеличения вашего набора данных, потому что MNIST является относительно небольшим набором данныхи числа централизованы, изображение не имеет шума и т. д.

И можно использовать другие концепции, такие как Dropouts: идея Dropouts заключается в том, что они удаляют случайное число нейронов в вашей нейронной сети. Это работает очень хорошо по двум причинам: во-первых, соседние нейроны часто имеют одинаковые веса, что может привести к переоснащению, поэтому случайное выбрасывание некоторых из них может убрать это. уменьшите размер представления, с этим он обнаружит больше функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...