Вход 0 несовместим с моделью слоя_1: ожидаемая форма=(Нет, 244, 720, 3), найденная форма=(Нет, 720, 3)

#tensorflow #machine-learning #keras #deep-learning #conv-neural-network

Вопрос:

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

 IMAGE_SIZE = [244,720]
inception = InceptionV3(input_shape=IMAGE_SIZE   [3], weights='imagenet',include_top=False)
 

Также вот код загрузки моего тестового изображения

 picture =  image.load_img('/content/DSC_0365.JPG', target_size=(244,720))
img = img_to_array(picture)
prediction = model.predict(img)
print (prediction)
 

Я все еще новичок в машинном обучении, поэтому мои знания сейчас еще не настолько глубоки.

Ответ №1:

В основном это связано с тем, что вы не подготовили свои входные данные (их размер) для своей исходной модели. Вот одно из возможных решений.


Модель

 from tensorflow.keras.applications import *

IMAGE_SIZE = [244,720]
inception = InceptionV3(input_shape=IMAGE_SIZE   [3], 
                         weights='imagenet', include_top=False)

# check it's input shape 
inception.input_shape
(None, 244, 720, 3)
 

Вывод

Давайте протестируем образец, передав его модели.

 from PIL import Image 

a = Image.open('/content/1.png').convert('RGB')
display(a)
 

введите описание изображения здесь

Проверьте его основные свойства.

 a.mode, a.size, a.format
('RGB', (297, 308), None)
 

Итак, его форма уже в ( 297 x 308 x 3 ). Но чтобы передать его в модель, нам нужна дополнительная ось, которая является осью пакета. Для этого мы можем сделать

 import tensorflow as tf
import numpy as np 

a = tf.expand_dims(np.array(a), axis=0)
a.shape
TensorShape([1, 308, 297, 3])
 

Гораздо лучше. Теперь мы, возможно, захотим нормализовать наши данные и изменить их размер в соответствии с формой ввода модели. Для этого мы можем сделать:

 a = tf.divide(a, 255)       
a = tf.image.resize(a, [244,720])  
a.shape
TensorShape([1, 244, 720, 3])
 

И, наконец, передайте его модели.

 inception(a).shape
TensorShape([1, 6, 21, 2048])

# or, preserve the prediction to later analysis 
y_pred = inception(a)
 

Обновленный

Если вы используете [tf.keras] функцию обработки изображений, которая загружает изображение в формат PIL, то мы можем сделать просто:

 image = tf.keras.preprocessing.image.load_img('/content/1.png', 
                                             target_size=(244,720))
input_arr = tf.keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr])  # Convert single image to a batch.

inception(input_arr).shape
TensorShape([1, 6, 21, 2048])
 

Комментарии:

1. Спасибо, сэр! Я отредактирую свой код и обновлю вас после того, как получу результаты.

2. Это сработало. 🙂 Но чтобы добавить, как я могу вставить это изображение с измененным размером в свой код для прогнозирования изображения (код указан в моем обновленном посте)?

3. картинка = изображение.load_img(‘/content/DSC_0365.JPG’, target_size=(244 720)) img = img_to_array(изображение) прогноз = модель.прогноз(img) печать (прогноз)

4. это был мой предыдущий код. Как я могу вставить туда изображение с измененным размером?

5. Оооо, ух ты, я вижу. Спасибо, сэр! Проблема решена. Я ценю ваши усилия, больше энергии! Хорошего вам дня!