Ошибка при попытке Transfer Learning

Вопрос или проблема

Я пытаюсь обучить модель, которая является расширением Inception-V3 от Google с целью распознавания и классификации наличия пневмонии на рентгеновских изображениях.

Я использовал Tensorflow-Hub для прохождения этапа трансферного обучения, код выглядит следующим образом:

import tensorflow_hub as hub

module_selection = ("inception_v3", 1200, 2048)
handle_base, pixels, FV_SIZE = module_selection
MODULE_HANDLE = "https://tfhub.dev/google/tf2-preview/{}/feature_vector/4".format(handle_base)
IMAGE_SIZE = (pixels, pixels)
print("Используя {} с размером входа {} и размером выхода {}".format(MODULE_HANDLE,
                                                                  IMAGE_SIZE, FV_SIZE))

do_fine_tuning = False

feature_extractor = hub.KerasLayer(MODULE_HANDLE,
                                  input_shape = IMAGE_SIZE,
                                  output_shape = [FV_SIZE],
                                  trainable = do_fine_tuning)

model = tf.keras.Sequential([
  feature_extractor,
  tf.keras.layers.Conv2D(16, (5,5), activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides = 2),
  tf.keras.layers.Conv2D(32, (5, 5), activation = 'relu'),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides = 2),
  tf.keras.layers.Conv2D(64, (5, 5), activation = 'relu'),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides = 2),
  tf.keras.layers.Conv2D(128, (5, 5), activation = 'relu'),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides = 2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(1024, activation = 'relu'),
  tf.keras.layers.Dense(256, activation = 'relu'),
  tf.keras.layers.Dense(1, activation = 'sigmoid') 
])

model.summary()

Ошибка выглядит следующим образом:

WARNING:tensorflow:Entity <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x00000270F553F348> не может быть преобразована и будет выполнена как есть. Пожалуйста, сообщите об этом команде AutoGraph. При подаче бага установите уровень подробности на 10 (в Linux, `export AUTOGRAPH_VERBOSITY=10`) и прикрепите полный вывод. Причина: Не удалось найти подходящую функцию для вызова из загруженной модели. Получено:
  Позиционные аргументы (всего 4):
    * Tensor("inputs:0", shape=(None, 1200, 1200), dtype=float32)
    * False
    * False
    * 0.99
  Ключевые аргументы: {}

Ожидались эти аргументы, чтобы соответствовать одному из следующих 4 вариантов:

Вариант 1:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * True
    * False
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}

Вариант 2:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * True
    * True
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}

Вариант 3:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * False
    * True
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}

Вариант 4:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * False
    * False
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}
WARNING:tensorflow:Entity <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x00000270F553F348> не может быть преобразована и будет выполнена как есть. Пожалуйста, сообщите об этом команде AutoGraph. При подаче бага установите уровень подробности на 10 (в Linux, `export AUTOGRAPH_VERBOSITY=10`) и прикрепите полный вывод. Причина: Не удалось найти подходящую функцию для вызова из загруженной модели. Получено:
  Позиционные аргументы (всего 4):
    * Tensor("inputs:0", shape=(None, 1200, 1200), dtype=float32)
    * False
    * False
    * 0.99
  Ключевые аргументы: {}

Ожидались эти аргументы, чтобы соответствовать одному из следующих 4 вариантов:

Вариант 1:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * True
    * False
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}

Вариант 2:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * True
    * True
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}

Вариант 3:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * False
    * True
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}

Вариант 4:
  Позиционные аргументы (всего 4):
    * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
    * False
    * False
    * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
  Ключевые аргументы: {}
---------------------------------------------------------------------------
ValueError                                Traceback (последний вызов последнего)
<ipython-input-25-a2ea981d199c> в <module>
     19   tf.keras.layers.Dense(1024, activation = 'relu'),
     20   tf.keras.layers.Dense(256, activation = 'relu'),
---> 21   tf.keras.layers.Dense(1, activation = 'sigmoid')
     22 ])
     23 

~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\training\tracking\base.py в _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     попробуйте:
--> 457       результат = метод(self, *args, **kwargs)
    458     наконец:
    459       self._self_setattr_tracking = предыдущие значение  # pylint: disable=protected-access

~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\keras\engine\sequential.py в __init__(self, layers, name)
    112       tf_utils.assert_no_legacy_layers(layers)
    113       для слоя в слоях:
--> 114         self.add(layer)
    115 
    116   @property

~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\training\tracking\base.py в _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     попробуйте:
--> 457       результат = метод(self, *args, **kwargs)
    458     наконец:
    459       self._self_setattr_tracking = предыдущие значение  # pylint: disable=protected-access

~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\keras\engine\sequential.py в add(self, layer)
    176           # и создать узел, соединяющий текущий слой
    177           # с входным слоем, который мы только что создали.
--> 178           layer(x)
    179           set_inputs = True
    180 

~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\keras\engine\base_layer.py в __call__(self, inputs, *args, **kwargs)
    840                     not base_layer_utils.is_in_eager_or_tf_function()):
    841                   с auto_control_deps.AutomaticControlDependencies() как acd:
--> 842                     outputs = call_fn(cast_inputs, *args, **kwargs)
    843                     # Обернуть Тензоры в `outputs` в `tf.identity`, чтобы избежать
    844                     # круговых зависимостей.

~\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\autograph\impl\api.py в wrapper(*args, **kwargs)
    235       except Exception as e:  # pylint:disable=broad-except
    236         if hasattr(e, 'ag_error_metadata'):
--> 237           raise e.ag_error_metadata.to_exception(e)
    238         еще:
    239           raise

ValueError: в преобразованном коде:

    D:\Anaconda\lib\site-packages\tensorflow_hub\keras_layer.py:216 call  *
        результат = smart_cond.smart_cond(training,
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\smart_cond.py:56 smart_cond
        вернуть false_fn()
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\saved_model\load.py:436 _call_attribute
        вернуть instance.__call__(*args, **kwargs)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\eager\def_function.py:457 __call__
        результат = self._call(*args, **kwds)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\eager\def_function.py:494 __call__
        результаты = self._stateful_fn(*args, **kwds)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\eager\function.py:1822 __call__
        графовая функция, args, kwargs = self._maybe_define_function(args, kwargs)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\eager\function.py:2150 _maybe_define_function
        графовая функция = self._create_graph_function(args, kwargs)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\eager\function.py:2041 _create_graph_function
        capture_by_value=self._capture_by_value),
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\framework\func_graph.py:915 func_graph_from_py_func
        func_outputs = python_func(*func_args, **func_kwargs)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\eager\def_function.py:358 wrapped_fn
        вернуть weak_wrapped_fn().__wrapped__(*args, **kwds)
    C:\Users\Sagar Mishra\AppData\Roaming\Python\Python37\site-packages\tensorflow_core\python\saved_model\function_deserialization.py:262 тело_восстановленной_функции
        "\n\n".join(signature_descriptions)))

    ValueError: Не удалось найти подходящую функцию для вызова из загруженной модели. Получено:
      Позиционные аргументы (всего 4):
        * Tensor("inputs:0", shape=(None, 1200, 1200), dtype=float32)
        * False
        * False
        * 0.99
      Ключевые аргументы: {}

    Ожидались эти аргументы, чтобы соответствовать одному из следующих 4 вариантов:

    Вариант 1:
      Позиционные аргументы (всего 4):
        * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
        * True
        * False
        * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
      Ключевые аргументы: {}

    Вариант 2:
      Позиционные аргументы (всего 4):
        * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
        * True
        * True
        * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
      Ключевые аргументы: {}

    Вариант 3:
      Позиционные аргументы (всего 4):
        * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
        * False
        * True
        * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
      Ключевые аргументы: {}

    Вариант 4:
      Позиционные аргументы (всего 4):
        * TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")
        * False
        * False
        * TensorSpec(shape=(), dtype=tf.float32, name="batch_norm_momentum")
      Ключевые аргументы: {}

Я даже не знаю, с чего начать решать эту ошибку, возможно, проблема в слое, который соединяет слой Inception и мою пользовательскую модель?

Мне кажется, что загружаемая вами сохраненная модель из tf_hub не совместима с указанной вами формой:

То, что вы передаете в keras, похоже, дает:

Получено:
      Позиционные аргументы (всего 4):
        * Tensor("inputs:0", shape=(None, 1200, 1200), dtype=float32)

Сохраненная модель, похоже, ожидает:

TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")

Я предполагаю, что эти размеры:
(batch, высота, ширина, цветовые каналы)

Что произойдет, если вы поиграете с этой строкой:

input_shape = IMAGE_SIZE

Может попробуйте:

input_shape = (None, None, 3)

Ответ или решение

Когда вы работаете с обучением с переносом, особенно с использованием внешних модулей, таких как TensorFlow Hub, важно правильно настраивать входные параметры. Данная проблема, с которой вы столкнулись, идет от несовпадения формата ввода в вашем коде и ожидаемого формата для загруженной модели. Давайте рассмотрим этот вопрос более подробно.

Понимание проблемы

Исходя из вашего сообщения об ошибке, модель ожидает входные данные в формате:

TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name="inputs")

Это означает, что модель ожидает тензор с произвольными размерами высоты и ширины, состоящий из трех каналов цвета (RGB). Однако ваш текущий код передает:

Tensor("inputs:0", shape=(None, 1200, 1200), dtype=float32)

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

Решение проблемы

Попробуйте изменить строку, где вы задаете input_shape для слоя Keras так:

input_shape = (None, None, 3)

Эта модификация позволит модели принимать на вход изображения любого размера, а не только фиксированного размера 1200 на 1200 пикселей.

Ваш код после корректировки может выглядеть так:

feature_extractor = hub.KerasLayer(MODULE_HANDLE,
                                  input_shape = (None, None, 3),
                                  output_shape = [FV_SIZE],
                                  trainable = do_fine_tuning)

Дополнительные совет по обучению

Кроме изменения входного формата, вот несколько дополнительных рекомендаций:

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

  2. Fine-tuning: Если вы планируете выполнять fine-tuning (тонкую настройку) модели, убедитесь, что do_fine_tuning установлено в True и вы используете подходящий набор данных для этого процесса.

  3. Мониторинг обучения: Используйте TensorBoard для наблюдения за процессом обучения и метриками, чтобы убедиться, что ваша модель действительно обучается.

Заключение

Понимание структуры входных данных и требований загруженной модели имеет критическое значение для успешного обучения. Обязательно проверяйте все параметры и при необходимости адаптируйте их под целевую модель. Изменение input_shape на (None, None, 3) должно разрешить данную проблему, но не забывайте следить за другими аспектами вашей модели и данных. Удачи в вашем проекте по распознаванию и классификации пневмонии на рентгеновских снимках!

Оцените материал
Добавить комментарий

Капча загружается...