Как я могу заставить обученную модель идентифицировать изображения, извлеченные из другого места?
Модель обучена с использованием набора данных MNIST и изображений, которые будут
по модели идентифицируются рукописные цифры, извлеченные из документа.
Используются следующие библиотеки: tensorflow 2.0
, cv2
и numpy
.
Как я понимаю, model.predict()
идентифицирует свой ввод. Под этим я подразумеваю, что если я введу там рукописное изображение «3» в некоторой форме, оно идентифицирует и выведет «3». Опять же, это сказанное model
обучено с набором данных MNIST на основе этого набора учебных пособий .
Предполагая, что это так, я хотел бы знать параметры функции или как мне отформатировать изображение / набор изображений, чтобы получить ожидаемый результат. Если нет, то я бы хотел знать, как именно это сделать.
import cv2
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow import keras
# Load and prepare the MNIST dataset. Convert the samples from integers to floating-point numbers:
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def createModel():
# Build the tf.keras.Sequential model by stacking layers.
# Choose an optimizer and loss function used for training:
model = tf.keras.models.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.2),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
model = createModel()
model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
model.evaluate(x_test, y_test)
c = cv2.imread("./3.png", 1)
c = c.reshape(-1, 28*28)/255.0
# now what?
Я ожидал, что model.predict()
сделает это так, как мне нужно. Пока это мои попытки:
model.predict(c)
выходы TypeError: predict() missing 1 required positional argument: 'x'
model.predict([""], c)
выходы ValueError: When using data tensors as input to a model, you should specify the
шаги argument.
и так далее.
Я знаю, что в этот момент я вхожу слепо и неправильно. Любой шаг в правильном направлении приветствуется. Спасибо!
EDIT:
Так что я знаю, что входное изображение c
должно быть в оттенках серого 28x28 даже до изменения формы, поэтому я попытался пропустить это. Ошибка, которая появилась, когда я реализовал прогноз:
...
tensorflow.python.framework.errors_impl.InvalidArgumentError: Matrix size-incompatible: In[0]: [28,28], In[1]: [784,128]
[[{{node dense/MatMul}}]] [Op:__inference_keras_scratch_graph_2593]
Итак, я использовал c = c.reshape(-1, 28*28)/255.0
до предсказания, но тогда он никогда не предсказывал правильное значение любой цифры.
Затем я попытался использовать cv2.imshow(str(predicted_value), c)
, чтобы показать, как будет выглядеть входное изображение. Показанное изображение представляет собой тонкую линию черных и белых пятен. Поскольку я до сих пор не могу связать изображения, здесь есть ссылка на вывод .
Мой вопрос: это то, как должно выглядеть изображение для модели? Или что я все испортил? Спасибо!