В чем проблема с моей нейронной сетью, которая дает неверные прогнозы - PullRequest
0 голосов
/ 27 января 2019

Итак, я обучаю свою нейронную сеть на примере данных о поездах из керас, а затем добавляю ее в свой собственный рукописный текст в краске.

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. Хотя это правильно работает с примерами данных тестирования.

Также я думаю, что проблема может заключаться в том, что моя цифра имеет другой фон с примерами тренировочных данных.Моя картинка имеет желтый цвет. Это изображение моих фотографий

Ответы [ 2 ]

0 голосов
/ 27 января 2019

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

0 голосов
/ 27 января 2019

Вы неправильно обрабатываете входные данные.

MNIST является двоичным набором данных, поэтому значения пикселей находятся в диапазоне [0, 255] и могут принимать только значение 0 или 255. Ваша сеть изучилаthis.

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

Вы можете сделать это с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...