Проблема с тестом CNN, помогите решить ошибку

Текст ошибки: ValueError: Exception encountered when calling layer "sequential" (type Sequential).

Input 0 of layer "conv2d" is incompatible with the layer: expected axis -1 of input shape to have value 1, but received input with shape (None, 28, 28, 3)

Вот код:

    # Model / data parameters
num_classes = 10
input_shape = (28, 28, 1)

# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# [0, 1] range
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
# shape (28, 28, 1)
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
print("x_train shape:", x_train.shape)
print(x_train.shape[0], "train samples")
print(x_test.shape[0], "test samples")


# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)


model = keras.Sequential(
    [
        keras.Input(shape=input_shape),
        layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
        layers.MaxPooling2D(pool_size=(2, 2)),
        layers.Flatten(),
        layers.Dropout(0.5),
        layers.Dense(num_classes, activation="softmax"),
    ]
)

batch_size = 128
epochs = 25

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

history=model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1, verbose=1)

Тут проверяю CNN на своем изображении, но появляется эта ошибка

img = cv2.imread("0.jpg")
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img=cv2.resize(img,(28, 28))
x = image.img_to_array(img)
x=255-x
x /= 255
x = np.expand_dims(x, axis=0)

prediction = model.predict(x)
prediction = np.argmax(prediction)
print("распознано: ", prediction)

Ответы (1 шт):

Автор решения: CrazyElf
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Вы не задали выходной параметр, у вас результат преобразования никуда не попал, картинка осталась цветная, из 3-х компонент, а модель ждёт ч/б картинку из одной компоненты - это видно из ошибки:

expected axis -1 of input shape to have value 1, <-- ожидалась одна компонента
but received input with shape (None, 28, 28, 3)  <-- а получено 3

Правильный код видимо будет такой - добавлен параметр куда класть преобразованную картинку:

cv2.cvtColor(img, img, cv2.COLOR_BGR2GRAY)
                  ^^^^
→ Ссылка