AttributeError: нормализовать fastai

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

Я пытаюсь использовать fastai для обучения модели, однако получаю эту ошибку, когда пытаюсь нормализовать свои данные, используя статистику imagenet. После некоторых поисков я не могу найти подходящей замены для этой строки.

У вас есть решение?

def train():
    data_directory = Path('Data_spec/')
    data = ImageDataLoaders.from_folder(data_directory, ds_tfms=[], size=16)
    data.normalize(imagenet_stats) # ЗДЕСЬ
    learn = cnn_learner(data, models.resnet34, metrics=error_rate)
    learn.fit_one_cycle(3)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-138-2da0ffaf5447> in <module>()
----> 1 train()

4 frames
/usr/local/lib/python3.7/dist-packages/fastcore/transform.py in gather_attrs(o, k, nm)
    171     att = getattr(o,nm)
    172     res = [t for t in att.attrgot(k) if t is not None]
--> 173     if not res: raise AttributeError(k)
    174     return res[0] if len(res)==1 else L(res)
    175 

AttributeError: normalize
```

Вот решение, которое я нашел.

batch_tfms = [IntToFloatTensor(), Normalize.from_stats(*imagenet_stats)]
data = ImageDataLoaders.from_folder(data_directory, ds_tfms=batch_tfms, size=16)

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

Ошибка AttributeError: normalize в fastai возникает, когда вы пытаетесь использовать метод нормализации, который больше не доступен в текущей версии библиотеки, или вызываете его неправильно. Для решения данной проблемы, важно понимать, как нормализация данных осуществляется в fastai, особенно с использованием статистики ImageNet.

Причины ошибки

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

data.normalize(imagenet_stats) # HERE

Причиной проблемы является то, что метод normalize, который раньше включал функциональность нормализации для объекта DataLoaders, больше не поддерживается в новых версиях библиотеки fastai.

Решение

Для нормализации ваших данных в fastai 2.x вам нужно применять трансформации (transformations) в момент создания загрузчика данных. Вместо использования метода normalize, вы можете применить нормализацию через предопределенные преобразования. Вот как это можно сделать:

  1. Создание трансформаций: Вместо использования data.normalize(imagenet_stats), создайте список трансформаций для нормализации ваших изображений.

  2. Использование ImageDataLoaders: Примените эти трансформации при создании вашего ImageDataLoaders.

Вот исправленный код:

from fastai.vision.all import *

def train():
    data_directory = Path('Data_spec/')
    # Определение трансформаций
    batch_tfms = [IntToFloatTensor(), Normalize.from_stats(*imagenet_stats)]
    # Создание `DataLoaders` с трансформациями
    data = ImageDataLoaders.from_folder(data_directory, ds_tfms=[], size=16, batch_tfms=batch_tfms)

    # Создание модели и обучение
    learn = cnn_learner(data, models.resnet34, metrics=error_rate)
    learn.fit_one_cycle(3)

Что важно учесть

  • Применение нормализации: Используя Normalize.from_stats(*imagenet_stats), вы согласовываете свой процесс нормализации с общепринятыми статистическими данными ImageNet, которые являются весьма необходимыми для правильной работы предобученных моделей.

  • Совместимость с версиями: Обязательно проверьте, какую версию fastai вы используете. Некоторые функции и методы могут изменяться и устаревать между разными версиями.

Заключение

Проблема с AttributeError: normalize является распространенной среди пользователей fastai, особенно тех, кто не обновлял свои знания о библиотеке после ее изменений. Следуя приведенному выше подходу, вы сможете успешно нормализовать ваши данные и продолжить обучение модели без ошибок. Обратите внимание на обновления документации fastai для получения актуальной информации о методах и их использовании в ваших проектах.

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

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