Проблемы с размерами: ошибка при проверке ввода: ожидалось, что conv2d_1_input имеет 4 измерения, но получил массив с формой (26, 26, 1) - PullRequest
0 голосов
/ 22 марта 2020

У меня есть CNN, который получает в качестве входных данных следующие изображения, преобразованные при обнаружении острых краев в двоичное изображение. И выводит одну из трех категорий.

img = cv2.imread(path)
img = cv2.Canny(img, 33, 76)
img = np.resize(img, (26, 26, 1))
imgs.append(img)

Насколько я понял, мне нужно преобразовать его в 3-мерное (26,26,1) изображение, чтобы сеть могла с ним работать. Это моя сеть:

IMG_HEIGHT = 26
IMG_WIDTH = 26
no_Of_Filters=60
size_of_Filter=(5,5)
size_of_pool=(2,2)
no_Of_Nodes = 500
model_new = Sequential([
    Conv2D(no_Of_Filters, size_of_Filter, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH , 1)),
    MaxPooling2D(pool_size=size_of_pool),
    Conv2D(no_Of_Filters, size_of_Filter, padding='same', activation='relu'),
    MaxPooling2D(pool_size=size_of_pool),
    Conv2D(64, size_of_Filter, padding='same', activation='relu'),
    MaxPooling2D(pool_size=size_of_pool),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(3, activation='softmax')
])

Тренировка работает отлично. После того, как я обучил и создал модель, я хочу протестировать изображения с этой сетью

test_image = cv2.Canny(test_image ,33,76)
test_image = np.resize(test_image, (26, 26, 1))
test_image = test_image [np.newaxis, ...]
prediction = model.predict(test_image)
print(prediction)

Теперь я получаю ошибку:

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (26, 26, 1)

Почему обученная модель теперь хочет четырехмерный ввод. Я не понимаю.

Решение

This is the new test code:
test_image = cv2.Canny(test_image ,33,76)
test_image = np.resize(test_image, (26, 26, 1))
test_image = test_image [np.newaxis, ...] # answer line added here
prediction = model.predict(test_image)
print(prediction)

1 Ответ

1 голос
/ 22 марта 2020

Вам необходимо добавить измерение в ваш массив, потому что, как говорится в сообщении, keras ожидает четырехмерный ввод.

test_image = test_image[np.newaxis, ...]

keras работает с такими фигурами, как (1, 26, 26, 1), а не (26, 26, 1). Добавленные первые размеры - это размер партии, и keras это необходимо.

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