Ошибка Keras NasNetlarge без верхнего уровня

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

Я пытаюсь использовать 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? Две вещи, которые вы могли бы попробовать:

  1. Обновите вашу keras до последней версии
  2. Если вышеуказанное не сработает, откройте файл 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.

Решения

  1. Обновите Keras до последней версии

    Первым шагом стоит убедиться, что вы используете последнюю стабильную версию Keras. Для этого вы можете выполнить следующую команду:

    pip install --upgrade keras

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

  2. Настройка функции загрузки весов в файле 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 в области машинного обучения.

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

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