Как решить проблему «Ошибка при проверке ввода: ожидалось, что flatten_7_input будет иметь форму (28, 28), но получил массив с формой (28, 3)» - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать NN, используя пример на Tensorflow, и передать ему свою собственную рукописную цифру, чтобы предсказать правильную метку, но форма массива не позволяет мне это сделать.

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
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 = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  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=5)
model.evaluate(x_test, y_test)

path = 'C:/Users/pewdu/Desktop/third.jpg'
img = cv2.imread(path)
new_img = cv2.resize(img, (28, 28))
new_img = new_img / 255.0
print(new_img.shape) # it equals to (28,28,3)
prediction = model.predict(new_img)

Итак, ошибка:

ValueError: Error when checking input: expected flatten_7_input to have shape (28, 28) but got array with shape (28, 3)

1 Ответ

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

Сообщение Error говорит само за себя.

Инициализированная вами модель ожидает данные в формате N x W x H, где

  • N = Количество примеров
  • W = Ширина изображения
  • H = Высота изображения

Когда вы читаете изображение, используя cv2.imread(), вы можете видеть, что размер изображения указан в формате W x H x C, где

  • W = ширина изображения
  • H = высота изображения
  • C = количество каналов в изображении (3 для RGB / BGR и 1 для GrayScale)

Ваша модель ожидает нормализованное изображение в оттенках серого.А так как вы отправляете только одно изображение (один пример), вам нужно изменить форму массива изображений, добавив ось спереди.

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