функция прогнозирования выдает один и тот же результат каждый раз - PullRequest
0 голосов
/ 10 апреля 2020
from keras.datasets import mnist
from keras.models import Sequential, load_model
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
from keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import cv2
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape((X_train.shape[0], 28, 28, 1)).astype('float32')
X_test = X_test.reshape((X_test.shape[0], 28, 28, 1)).astype('float32')
X_train = X_train / 255
X_test = X_test / 255
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
def larger_model():
    model = Sequential()
    model.add(Conv2D(30, (5, 5), input_shape=(28, 28, 1), activation='relu'))
    model.add(MaxPooling2D())
    model.add(Conv2D(15, (3, 3), activation='relu'))
    model.add(MaxPooling2D())
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(50, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
model = larger_model()
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=200)
scores = model.evaluate(X_test, y_test, verbose=0)
print("Large CNN Error: %.2f%%" % (100-scores[1]*100))

model.save('good_model.h5')
print("Model saved")

После запуска этого кода мы получаем модель '.h5', а затем предсказываем это изображение Я добавил этот код:

import cv2
model = load_model('good_model.h5')
file = cv2.imread('screenshot.png')
file = cv2.resize(file, (28, 28))
file = cv2.cvtColor(file, cv2.COLOR_BGR2GRAY)
file = file.reshape((-1, 28, 28,1))
result = model.predict(file)
print(result[0])
t = (np.argmax(result[0]))
print("I predict this number is a:", t)

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

1 Ответ

0 голосов
/ 11 апреля 2020

Вам нужно инвертировать изображение перед предсказанием. Как только вы инвертируете изображение, оно будет правильно предсказывать. Данный пример предсказывает как «2», но я проверил с другими изображениями, такими как «7», и это правильно предсказывает.

file = cv2.bitwise_not(file)

Кроме того, я внес одно изменение. Я импортировал модули из Tensorflow 2.x. Пожалуйста, проверьте полный код здесь . Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

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