Вопрос или проблема
Я пытаюсь использовать 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
, вы можете применить нормализацию через предопределенные преобразования. Вот как это можно сделать:
-
Создание трансформаций: Вместо использования
data.normalize(imagenet_stats)
, создайте список трансформаций для нормализации ваших изображений. -
Использование
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 для получения актуальной информации о методах и их использовании в ваших проектах.