Вопрос или проблема
Я пытаюсь использовать NasNetlarge
в Keras без верхней части, но не могу избавиться от верхней части:
from keras.applications import NASNetLarge
model = NASNetLarge(input_shape=(224, 224, 3), include_top=False,
weights="imagenet")
Если я использую любую форму, отличную от (331, 331, 3), я получаю ошибку, что я должен использовать (331, 331, 3), если include_top=True
, хотя я установил include_top=False
. Если я устанавливаю форму входа на (331, 331, 3) и include_top
на False
, он загружает веса с верхней частью. Я делаю что-то не так или в модуле Keras есть ошибка?
Какова ваша версия keras? Две вещи, которые вы могли бы попробовать:
- Обновите вашу keras до последней версии
-
Если вышеуказанное не сработает, откройте файл nasnet.py в keras и измените эту часть кода:
elif default_size == 331: # большая версия if include_top: weight_path = NASNET_LARGE_WEIGHT_PATH model_name="nasnet_large.h5" else: weight_path = NASNET_LARGE_WEIGHT_PATH_NO_TOP model_name="nasnet_large_no_top.h5" weights_file = get_file(model_name, weight_path, cache_subdir="models") model.load_weights(weights_file)
на это:
elif default_size == 331: # большая версия if include_top: weight_path = NASNET_LARGE_WEIGHT_PATH model_name="nasnet_large.h5" else: weight_path = NASNET_LARGE_WEIGHT_PATH_NO_TOP model_name="nasnet_large_no_top.h5" weights_file = get_file(model_name, weight_path, cache_subdir="models") model.load_weights(weights_file, by_name = True)
Ответ или решение
При работе с моделью NASNetLarge в Keras возникает проблема, связанная с использованием параметров include_top
и input_shape
. Согласно описанию проблемы, пользователи сталкиваются с ошибками при попытке настроить входные параметры модели неправильно. Давайте подробнее рассмотрим решения и возможные способы устранения этой проблемы.
Проблема
Вы пытаетесь зарегистрировать NasNetLarge без верхней части (то есть без классификации, занимающейся предсказанием на наборе классов), используя следующий код:
from keras.applications import NASNetLarge
model = NASNetLarge(input_shape=(224, 224, 3), include_top=False, weights="imagenet")
Хотя вы правильно указываете include_top=False
, вы все равно получаете ошибку, связанную с тем, что модель требует входные данные размером (331, 331, 3), если верхняя часть указана как истина. Это может вызывать замешательство и указывать на возможную ошибку в самой библиотеке Keras.
Решения
-
Обновите Keras до последней версии
Первым шагом стоит убедиться, что вы используете последнюю стабильную версию Keras. Для этого вы можете выполнить следующую команду:
pip install --upgrade keras
Новые версии часто содержат исправления ошибок, которые могут решить вашу проблему.
-
Настройка функции загрузки весов в файле nasnet.py
Если проблема сохраняется даже после обновления, вы можете вручную изменить код Keras, чтобы правильно загружались веса без верхней части. Найдите файл
nasnet.py
в установочной папке Keras и измените его следующим образом:Найдите код, который загружает веса, и измените его:
elif default_size == 331: # large version if include_top: weight_path = NASNET_LARGE_WEIGHT_PATH model_name="nasnet_large.h5" else: weight_path = NASNET_LARGE_WEIGHT_PATH_NO_TOP model_name="nasnet_large_no_top.h5" weights_file = get_file(model_name, weight_path, cache_subdir="models") model.load_weights(weights_file)
Измените его на:
elif default_size == 331: # large version if include_top: weight_path = NASNET_LARGE_WEIGHT_PATH model_name="nasnet_large.h5" else: weight_path = NASNET_LARGE_WEIGHT_PATH_NO_TOP model_name="nasnet_large_no_top.h5" weights_file = get_file(model_name, weight_path, cache_subdir="models") model.load_weights(weights_file, by_name=True)
Добавление параметра
by_name=True
при загрузке весов может помочь правильно загрузить слои без верхней части модели.
Итог
Работа с Keras и предобученными моделями может быть сложной из-за различных параметров и настройек. Следуя указанным шагам, вы сможете устранить описанную проблему с NASNetLarge. Если же трудности продолжаются, рекомендуется обратиться к документации Keras или сообществу разработчиков для получения дополнительной помощи.
Этот подход, основанный на диагностике и исправлении, не только решает текущую проблему, но и углубляет ваше понимание работы с высокоуровневыми API в области машинного обучения.