Ошибка при проверке ввода: ожидалось, что conv2d_4_input будет иметь 4 измерения, но получил массив с формой (32, 32) - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над системой распознавания изображений в CNN. Данные поезда и тестирования вводятся следующим образом:

trainDataGen = ImageDataGenerator(
        rotation_range = 5,
        width_shift_range = 0.1,
        height_shift_range = 0.1,
        rescale = 1.0/255,
        shear_range = 0.2,
        zoom_range = 0.2,       
        horizontal_flip = False,
        fill_mode = 'nearest')

test_datagen = ImageDataGenerator(rescale=1./255)
trainGenerator = trainDataGen.flow_from_directory(
            r"Dataset/Train",
            target_size = (32,32),
            batch_size = 32,
            color_mode = "grayscale",
            class_mode = "categorical")
validation_generator = test_datagen.flow_from_directory(
            r"Dataset/Test",
            target_size=(32,32),
            batch_size=32,
            color_mode = "grayscale",
            class_mode= 'categorical')

Реализована 4-х слойная CNN, которая начинается следующим образом:

model = Sequential()

#Layer1----------------------------------------------------------
model.add(Convolution2D(filters = 32,
            kernel_size = (3,3),
            strides = 1,
            activation = "relu",
            input_shape = (32,32,3)))

Обучение успешно выполнено следующим образом:

#Fit model on the loaded dataset---------
res=model.fit_generator(
        trainGenerator,
        epochs = 25,
        steps_per_epoch = 2444,
        validation_data = validation_generator,
        validation_steps = 432
        )

Теперь я пытаюсь проверить тестовые данные с помощью:

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

res= model.evaluate_generator(validation_generator)

Это показывает ошибку:

ValueError: Error when checking input: expected conv2d_4_input to have shape (32, 32, 3) but got array with shape (32, 32, 1)

Так как даже после многих попыток я не смог запустите opencv, вместо этого я пытаюсь использовать matplotlib.

# Python program to read 
# image using matplotlib 

# importing matplotlib modules 
import matplotlib.image as mpimg 
import matplotlib.pyplot as plt 

# Read Images 
img = mpimg.imread('pic.png') 

# Output Images 
plt.imshow(img) 

Работает отлично. Теперь я пытаюсь предсказать, что это за изображение pi c .png. Я пытаюсь:

lists = model.predict(img)

Это показывает ошибку:

ValueError: Error when checking input: expected conv2d_4_input to have 4 dimensions, but got array with shape (32, 32)

Может ли кто-нибудь помочь, как я могу изменить размер ввода?

1 Ответ

0 голосов
/ 19 июня 2020

Я думаю, что изображение, которое вы пытаетесь протестировать, является изображением в градациях серого, что означает, что оно имеет один канал, поэтому вы получаете эту ошибку 32x32 или 32x32x1.

В случае matplotlib, решение состоит в том, чтобы изменить форму изображения (32, 32) с помощью numpy на (32, 32, 1), трижды дублировать третье измерение:

import numpy as np
img = np.reshape(img, (32, 32, 1))
img = np.concatenate([img, img, img], axis=2)

Я думаю, вы должны изменить color_mode от gray_scale до rgb в вашем validation_generator

...