подаю картинку 720х1280х3 модель принимает Nonex1280x3 Keras

Моя модель:

self.model = Sequential()
        self.model.add(Lambda(lambda x: print(x.shape)))
        self.model.add(InputLayer(input_shape=(720, 1280, 3)))
        self.model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
        self.model.add(Conv2D(64, (3, 3), activation='relu', padding='same', strides=2))
        self.model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
        self.model.add(Conv2D(128, (3, 3), activation='relu', padding='same', strides=2))
        self.model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
        self.model.add(Conv2D(256, (3, 3), activation='relu', padding='same', strides=2))
        self.model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
        self.model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
        self.model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
        self.model.add(UpSampling2D((2, 2)))
        self.model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
        self.model.add(UpSampling2D((2, 2)))
        self.model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
        self.model.add(Conv2D(2, (3, 3), activation='sigmoid', padding='same'))
        self.model.add(UpSampling2D((2, 2)))

        self.model.compile(optimizer="adam", loss="mse")

в начале добавил Lambda чтобы получить размерность входа. Вот как осуществляю predict:

print(image.shape)
self.model.predict(image)

После запуска программы в начале получаю:

(720, 1280, 3)
(None, 1280, 3)
(None, 1280, 3)

а затем ошибку:

Traceback (most recent call last):
  File "C:\Users\Амаль\PreviuMaker\resizer\main.py", line 12, in <module>
    print(resizer.predict(image))
  File "C:\Users\Амаль\PreviuMaker\resizer\Model.py", line 32, in predict
    return self.model.predict(image)
  File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\5C61~1\AppData\Local\Temp\__autograph_generated_fileo1wmzcyg.py", line 15, in tf__predict_function
    retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
TypeError: in user code:

    File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\engine\training.py", line 2416, in predict_function  *
        return step_function(self, iterator)
    File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\engine\training.py", line 2401, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\engine\training.py", line 2389, in run_step  **
        outputs = model.predict_step(data)
    File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\engine\training.py", line 2357, in predict_step
        return self(x, training=False)
    File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File "C:\Users\Амаль\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\src\engine\input_spec.py", line 213, in assert_input_compatibility
        raise TypeError(

    TypeError: Exception encountered when calling layer 'sequential' (type Sequential).

    Inputs to a layer should be tensors. Got 'None' (of type <class 'NoneType'>) as input for layer 'conv2d'.

    Call arguments received by layer 'sequential' (type Sequential):
      • inputs=tf.Tensor(shape=(None, 1280, 3), dtype=float32)
      • training=False
      • mask=None

Можете подсказать, в чём может быть проблема?


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

Автор решения: CrazyElf

print ничего не возвращает, т.е. возвращает None, можно сказать. А слой Lambda используется для преобразования данных. Получается, что на выходе этого слоя вы вместо входных данных получаете None. Быстрый фикс может выглядеть так:

self.model.add(Lambda(lambda x: print(x.shape) or x))
                                               ^^^^ возвращаем в итоге x

Но вообще наверняка в Keras есть более подходящий слой для вывода отладочной информации.

P.S. Посмотреть вход первого слоя вроде бы можно так:

print(model.get_layer(index=0).input)
→ Ссылка