Невозможно предсказать набор данных с разным разрешением

После многих попыток проб и ошибок мне удалось создать модель, которая будет обучаться на наборе данных с изображениями разного разрешения.

Все работает хорошо, но когда я сохраняю эту модель, а затем загружаю ее, она не может предсказать несколько изображений с разным разрешением.

Обходной путь — загружать модель перед каждым изображением, но это совсем не идеально.

Есть ли способ исправить это? Или это ошибка?

Ошибка:

tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimension 1 in both shapes must be equal: shape[0] = [1,10,10,3] vs. shape[1] = [1,12,9,3] [Op:ConcatV2] name: concat

Полная трассировка:

Traceback (most recent call last):
  File "c:\Users\samue\Desktop\test\predicting.py", line 22, in <module>
    predicts = conv_model.predict(dataset)
  File "C:\Users\samue\AppData\Roaming\Python\Python310\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\samue\AppData\Roaming\Python\Python310\site-packages\tensorflow\python\framework\ops.py", line 7186, in raise_from_not_ok_status
    raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimension 1 in both shapes must be equal: shape[0] = [1,10,10,3] vs. shape[1] = [1,12,9,3] [Op:ConcatV2] name: concat

Как воспроизвести:

Я создал минимальный воспроизводимый пример только с двумя изображениями с разрешением [10, 10] и [9, 12], оба сохранены как .png с цветовым пространством rgb.

Бег training.py создает model.h5 модель, обученную после 1 эпохи всего с одним Conv2D слоем.

структура папок:

/main_folder
--training.py
--predicting.py
--/data
   --001.png
   --002.png

обучение.ру

import cv2, os
import keras
import tensorflow as tf
from keras import layers


strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
    input_layer = keras.Input(shape=(None, None, 3))
    out = layers.Conv2D(3, (3, 3), activation='sigmoid', padding='same')(input_layer)

    conv_model = keras.Model(input_layer, out)
    conv_model.compile(
        optimizer='adam', 
        loss=tf.keras.losses.MeanSquaredError()
    )

conv_model.summary()

path = "data"
data = [cv2.imread(os.path.join(path, f)) / 255 for f in os.listdir(os.path.join(path))]


def data_generator():
    for i in range(len(data)):
        yield data[i], data[i]


dataset = tf.data.Dataset.from_generator(
    data_generator, 
    output_types=(tf.float32, tf.float32), 
    output_shapes=((None, None, 3), (None, None, 3))
).batch(1)

conv_model.fit(
    dataset,
    epochs=1,
    validation_data=dataset
)

conv_model.save('model.h5')

прогнозирование.py

import cv2, os
import keras
import tensorflow as tf


path = "data"
data = [cv2.imread(os.path.join(path, f)) / 255 for f in os.listdir(os.path.join(path))]


def data_generator():
    for i in range(len(data)):
        yield data[i], data[i]


dataset = tf.data.Dataset.from_generator(
    data_generator, 
    output_types=(tf.float32, tf.float32), 
    output_shapes=((None, None, 3), (None, None, 3))
).batch(1)

conv_model = keras.models.load_model('model.h5')
predicts = conv_model.predict(dataset)

for i in predicts:
    print(i)
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
1
0
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод model.predict попытается упаковать свой вывод в один тензорный/пустой массив. Однако выходные данные должны иметь одинаковые размеры для всех выборок.

В случае различных измерений вы можете напрямую выполнить итерацию по набору данных и вызвать модель для уникального образца:

predicts = [conv_model(x) for x in dataset]

Обратите внимание, что для небольшого количества входных данных (т. е. batch_size = 1) рекомендуется использовать __call__ напрямую, а не метод прогнозирования.

Другие вопросы по теме