Вопрос или проблема
Я пытаюсь обучить модель, которая является расширением 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)
Дополнительные совет по обучению
Кроме изменения входного формата, вот несколько дополнительных рекомендаций:
-
Очистка данных: Убедитесь, что ваши входные изображения правильно обрабатываются (нормализованы, приведены к правильному размеру и т. д.).
-
Fine-tuning: Если вы планируете выполнять fine-tuning (тонкую настройку) модели, убедитесь, что
do_fine_tuning
установлено вTrue
и вы используете подходящий набор данных для этого процесса. -
Мониторинг обучения: Используйте TensorBoard для наблюдения за процессом обучения и метриками, чтобы убедиться, что ваша модель действительно обучается.
Заключение
Понимание структуры входных данных и требований загруженной модели имеет критическое значение для успешного обучения. Обязательно проверяйте все параметры и при необходимости адаптируйте их под целевую модель. Изменение input_shape
на (None, None, 3)
должно разрешить данную проблему, но не забывайте следить за другими аспектами вашей модели и данных. Удачи в вашем проекте по распознаванию и классификации пневмонии на рентгеновских снимках!