fastai – упрощение работы с нейросетями

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в fastai

fastai — это высокоуровневая библиотека машинного обучения на Python, построенная поверх PyTorch, которая радикально упрощает создание, обучение и применение современных нейронных сетей. Разработанная исследователями Джереми Ховардом и Сильваном Гугжаром, библиотека используется как в академических курсах ведущих университетов, так и в коммерческих проектах крупных компаний.

Основная философия fastai заключается в предоставлении максимально простого интерфейса для решения сложных задач машинного обучения, при этом сохраняя возможность глубокой настройки и кастомизации. Библиотека позволяет достигать state-of-the-art результатов буквально в нескольких строках кода.

Ключевые особенности и преимущества fastai

Высокоуровневый API поверх PyTorch

fastai построена на базе PyTorch, но предоставляет гораздо более удобный и интуитивный интерфейс. Это означает, что вы получаете всю мощь PyTorch с минимальными усилиями по написанию кода.

Поддержка множества типов задач

Библиотека поддерживает широкий спектр задач машинного обучения:

  • Классификация изображений
  • Сегментация объектов
  • Обработка естественного языка
  • Табличные данные
  • Коллаборативная фильтрация
  • Генерация изображений и текста
  • Регрессионные задачи

Встроенные современные техники обучения

fastai автоматически применяет передовые методы обучения нейронных сетей:

  • One Cycle Policy для оптимизации скорости обучения
  • Mixup и CutMix для аугментации данных
  • Progressive resizing для работы с изображениями
  • Label smoothing для улучшения генерализации
  • Automatic mixed precision для ускорения обучения

Предобученные модели и transfer learning

Библиотека предоставляет доступ к множеству предобученных архитектур:

  • ResNet, EfficientNet, RegNet для компьютерного зрения
  • LSTM, AWD-LSTM для обработки текста
  • UNet для сегментации
  • Трансформеры через интеграцию с HuggingFace

Мощные инструменты визуализации и интерпретации

fastai включает встроенные инструменты для анализа и интерпретации моделей, что критически важно для понимания работы алгоритмов и отладки.

Установка и начальная настройка

Установка библиотеки

Для установки fastai рекомендуется использовать conda или pip:

# Установка через conda (рекомендуется)
conda install -c fastai fastai

# Или через pip
pip install fastai

Импорт основных модулей

# Для работы с изображениями
from fastai.vision.all import *

# Для работы с текстом
from fastai.text.all import *

# Для работы с табличными данными
from fastai.tabular.all import *

# Для коллаборативной фильтрации
from fastai.collab import *

Архитектура fastai и основные компоненты

DataBlock API

DataBlock API — это декларативный подход к описанию данных, который позволяет четко определить, как загружать, обрабатывать и подавать данные модели.

dblock = DataBlock(
    blocks=(ImageBlock, CategoryBlock),
    get_items=get_image_files,
    get_y=parent_label,
    splitter=RandomSplitter(),
    item_tfms=Resize(224),
    batch_tfms=aug_transforms()
)

Learner — центральный класс обучения

Learner инкапсулирует модель, данные, функцию потерь, оптимизатор и метрики в единый объект, упрощая процесс обучения.

Система Callbacks

Callbacks позволяют добавлять функциональность в процесс обучения:

  • EarlyStoppingCallback для раннего останова
  • SaveModelCallback для сохранения лучших весов
  • CSVLogger для логирования метрик
  • ReduceLROnPlateau для адаптивного изменения learning rate

Mid-level API

При необходимости fastai предоставляет доступ к PyTorch-уровню для тонкой настройки и кастомизации.

Работа с изображениями

Классификация изображений

# Загрузка данных
path = untar_data(URLs.PETS)
files = get_image_files(path/"images")

# Функция для извлечения меток
def label_func(fname):
    return re.match(r'^[a-zA-Z_]+', fname.name).group(0)

# Создание DataLoaders
dls = ImageDataLoaders.from_name_func(
    path, files, label_func, 
    item_tfms=Resize(224),
    batch_tfms=aug_transforms()
)

# Создание и обучение модели
learn = vision_learner(dls, resnet34, metrics=accuracy)
learn.fine_tune(3)

Сегментация изображений

# Загрузка данных для сегментации
path = untar_data(URLs.CAMVID_TINY)
dls = SegmentationDataLoaders.from_label_func(
    path, bs=8, fnames=get_image_files(path/"images"),
    label_func=lambda o: path/"labels"/f"{o.stem}_P{o.suffix}",
    codes=np.loadtxt(path/"codes.txt", dtype=str)
)

# Создание U-Net модели
learn = unet_learner(dls, resnet34, metrics=Dice())
learn.fine_tune(10)

Детекция объектов

# Загрузка данных для детекции
path = untar_data(URLs.COCO_SAMPLE)
dls = ObjectDetectionDataLoaders.from_df(
    df, path, folder="train", 
    label_func=get_annotations,
    bs=16
)

# Создание модели детекции
learn = object_detection_learner(dls, arch=models.retinanet_resnet50_fpn)
learn.fine_tune(5)

Обработка естественного языка

Классификация текста

# Загрузка данных IMDB
path = untar_data(URLs.IMDB)
dls = TextDataLoaders.from_folder(path, valid='test')

# Создание классификатора
learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)
learn.fine_tune(4, 1e-2)

Языковое моделирование

# Создание языковой модели
dls_lm = TextDataLoaders.from_folder(path, is_lm=True)
learn_lm = language_model_learner(dls_lm, AWD_LSTM, drop_mult=0.3)
learn_lm.fit_one_cycle(1, 2e-2)

# Сохранение энкодера для дальнейшего использования
learn_lm.save_encoder('finetuned')

Интеграция с трансформерами

# Использование BERT для классификации
from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')

# Создание DataLoaders с кастомным токенизатором
dls = TextDataLoaders.from_folder(path, tokenizer=tokenizer)

Работа с табличными данными

Классификация на табличных данных

# Загрузка данных Adult
path = untar_data(URLs.ADULT_SAMPLE)
df = pd.read_csv(path/'adult.csv')

# Определение категориальных и непрерывных признаков
cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race']
cont_names = ['age', 'fnlwgt', 'education-num', 'hours-per-week']

# Создание DataLoaders
dls = TabularDataLoaders.from_df(
    df, path=path, y_names="salary",
    cat_names=cat_names, cont_names=cont_names,
    procs=[Categorify, FillMissing, Normalize]
)

# Обучение модели
learn = tabular_learner(dls, metrics=accuracy)
learn.fit_one_cycle(5)

Регрессия на табличных данных

# Для регрессионных задач
learn = tabular_learner(dls, loss_func=MSELossFlat(), metrics=rmse)
learn.fit_one_cycle(10, 1e-2)

Коллаборативная фильтрация

Рекомендательная система

# Загрузка данных MovieLens
path = untar_data(URLs.ML_SAMPLE)
dls = CollabDataLoaders.from_csv(path/'ratings.csv')

# Создание модели коллаборативной фильтрации
learn = collab_learner(dls, n_factors=50, y_range=(0, 5.5))
learn.fit_one_cycle(10, 5e-3)

Оптимизация обучения и advanced техники

One Cycle Policy

One Cycle Policy — это метод обучения, который циклически изменяет learning rate и momentum для достижения быстрой конвергенции:

# Поиск оптимального learning rate
learn.lr_find()

# Обучение с One Cycle Policy
learn.fit_one_cycle(5, lr_max=1e-2)

Градиентное накопление

# Для работы с большими батчами при ограниченной памяти
with learn.no_bar():
    learn.fit(5, lr=1e-3, grad_accum=4)

Mixed Precision Training

# Использование mixed precision для ускорения обучения
learn = learn.to_fp16()
learn.fit_one_cycle(5, 1e-2)

Прогрессивное изменение размера

# Постепенное увеличение размера изображений
learn.fine_tune(3, base_lr=1e-3, freeze_epochs=1)
learn.dls = learn.dls.new(size=256)
learn.fine_tune(3, base_lr=1e-4)

Интерпретация и анализ моделей

Анализ ошибок классификации

# Создание интерпретатора
interp = ClassificationInterpretation.from_learner(learn)

# Матрица ошибок
interp.plot_confusion_matrix()

# Примеры с наибольшими ошибками
interp.plot_top_losses(9, figsize=(15,11))

# Наиболее спорные примеры
interp.most_confused(min_val=5)

Визуализация активаций

# Визуализация того, на что обращает внимание модель
learn.show_results(max_n=6, figsize=(15,8))

# Grad-CAM для понимания важных областей
from fastai.vision.all import *
learn.show_cam(idx=0)

Анализ важности признаков

# Для табличных данных
learn.feature_importance()

# Permutation importance
from sklearn.inspection import permutation_importance
perm_importance = permutation_importance(learn.model, X_val, y_val)

Сохранение и развертывание моделей

Экспорт и загрузка моделей

# Экспорт обученной модели
learn.export('model.pkl')

# Загрузка модели для инференса
learn_inf = load_learner('model.pkl')

# Предсказание на новых данных
pred, pred_idx, probs = learn_inf.predict(img)

Развертывание через веб-интерфейс

# Создание простого веб-приложения с Gradio
import gradio as gr

def classify_image(img):
    pred, pred_idx, probs = learn_inf.predict(img)
    return {labels[i]: float(probs[i]) for i in range(len(labels))}

gr.Interface(
    fn=classify_image,
    inputs=gr.Image(shape=(224,224)),
    outputs=gr.Label(num_top_classes=3)
).launch()

Оптимизация для продакшена

# Экспорт в ONNX для кросс-платформенного использования
learn.export_onnx('model.onnx')

# Квантизация для уменьшения размера модели
learn.model = torch.quantization.quantize_dynamic(
    learn.model, {torch.nn.Linear}, dtype=torch.qint8
)

Интеграция с экосистемой

Интеграция с HuggingFace

# Использование предобученных трансформеров
from transformers import AutoTokenizer, AutoModelForSequenceClassification

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModelForSequenceClassification.from_pretrained('bert-base-uncased')

# Адаптация для fastai
learn = text_classifier_learner(dls, model, tokenizer=tokenizer)

Интеграция с PyTorch Lightning

# Использование fastai компонентов в PyTorch Lightning
import pytorch_lightning as pl

class FastaiLightningModule(pl.LightningModule):
    def __init__(self, arch, dls):
        super().__init__()
        self.model = create_cnn_model(arch, dls.c)
        self.dls = dls
    
    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.model(x)
        loss = F.cross_entropy(y_hat, y)
        return loss

Интеграция с MLflow

# Логирование экспериментов с MLflow
import mlflow
import mlflow.pytorch

with mlflow.start_run():
    learn.fit_one_cycle(5, 1e-2)
    mlflow.pytorch.log_model(learn.model, "model")
    mlflow.log_metric("accuracy", learn.recorder.values[-1][1])

Продвинутые техники и кастомизация

Создание кастомных архитектур

# Создание собственной архитектуры
class CustomNet(nn.Module):
    def __init__(self, n_classes):
        super().__init__()
        self.backbone = models.resnet50(pretrained=True)
        self.backbone.fc = nn.Linear(2048, n_classes)
        
    def forward(self, x):
        return self.backbone(x)

# Использование в fastai
learn = Learner(dls, CustomNet(dls.c), metrics=accuracy)

Кастомные функции потерь

# Создание собственной функции потерь
class FocalLoss(nn.Module):
    def __init__(self, alpha=1, gamma=2):
        super().__init__()
        self.alpha = alpha
        self.gamma = gamma
        
    def forward(self, inputs, targets):
        ce_loss = F.cross_entropy(inputs, targets, reduction='none')
        pt = torch.exp(-ce_loss)
        focal_loss = self.alpha * (1-pt)**self.gamma * ce_loss
        return focal_loss.mean()

# Использование кастомной функции потерь
learn = Learner(dls, model, loss_func=FocalLoss(), metrics=accuracy)

Кастомные callbacks

# Создание собственного callback
class PrintCallback(Callback):
    def after_epoch(self):
        print(f"Epoch {self.epoch}: loss={self.recorder.values[-1][0]:.4f}")

# Использование callback
learn = Learner(dls, model, cbs=PrintCallback())

Полная таблица методов и функций fastai

Загрузка и подготовка данных

Функция/Класс Описание Пример использования
untar_data() Загрузка и распаковка датасетов path = untar_data(URLs.PETS)
get_image_files() Получение списка файлов изображений files = get_image_files(path)
ImageDataLoaders.from_folder() Создание DataLoaders из папок dls = ImageDataLoaders.from_folder(path)
ImageDataLoaders.from_name_func() Создание DataLoaders с кастомной функцией dls = ImageDataLoaders.from_name_func(path, files, label_func)
TextDataLoaders.from_folder() Загрузка текстовых данных dls = TextDataLoaders.from_folder(path)
TabularDataLoaders.from_df() Загрузка табличных данных dls = TabularDataLoaders.from_df(df, y_names='target')
CollabDataLoaders.from_csv() Загрузка данных для коллаборативной фильтрации dls = CollabDataLoaders.from_csv(path)
DataBlock Гибкое API для создания DataLoaders dblock = DataBlock(blocks=(ImageBlock, CategoryBlock))

Создание и обучение моделей

Функция/Класс Описание Пример использования
vision_learner() Создание модели для компьютерного зрения learn = vision_learner(dls, resnet34, metrics=accuracy)
text_classifier_learner() Создание текстового классификатора learn = text_classifier_learner(dls, AWD_LSTM)
tabular_learner() Создание модели для табличных данных learn = tabular_learner(dls, metrics=accuracy)
collab_learner() Создание модели коллаборативной фильтрации learn = collab_learner(dls, n_factors=50)
unet_learner() Создание U-Net для сегментации learn = unet_learner(dls, resnet34, metrics=Dice())
language_model_learner() Создание языковой модели learn = language_model_learner(dls, AWD_LSTM)
Learner() Базовый класс для создания кастомных моделей learn = Learner(dls, model, loss_func, metrics)

Методы обучения

Метод Описание Параметры
fit() Базовый метод обучения epochs, lr, wd
fit_one_cycle() Обучение с One Cycle Policy epochs, lr_max, div, div_final, pct_start
fine_tune() Тонкая настройка предобученной модели epochs, base_lr, freeze_epochs
fit_sgdr() Обучение с SGDR epochs, lr, cycle_len, cycle_mult
lr_find() Поиск оптимального learning rate start_lr, end_lr, num_it
freeze() Заморозка слоев модели n (количество слоев)
unfreeze() Разморозка всех слоев -

Предсказание и оценка

Метод Описание Возвращаемое значение
predict() Предсказание на одном примере prediction, index, probabilities
get_preds() Получение предсказаний на наборе данных predictions, targets
validate() Валидация модели validation_loss, metrics
tta() Test Time Augmentation tta_predictions, tta_targets
show_results() Визуализация результатов -

Интерпретация моделей

Класс/Метод Описание Область применения
ClassificationInterpretation Интерпретация классификационных моделей Анализ ошибок, confusion matrix
plot_confusion_matrix() Построение матрицы ошибок Классификация
plot_top_losses() Визуализация наихудших предсказаний Отладка модели
most_confused() Наиболее спорные классы Анализ ошибок
show_cam() Grad-CAM визуализация Понимание решений CNN
feature_importance() Важность признаков Табличные данные

Сохранение и загрузка

Метод Описание Формат
save() Сохранение весов модели .pth
load() Загрузка весов .pth
export() Экспорт модели для инференса .pkl
load_learner() Загрузка экспортированной модели .pkl
save_encoder() Сохранение энкодера языковой модели .pth
load_encoder() Загрузка энкодера .pth

Трансформации и аугментации

Функция/Класс Описание Область применения
Resize() Изменение размера изображений Компьютерное зрение
RandomCrop() Случайная обрезка Аугментация изображений
aug_transforms() Стандартный набор аугментаций Компьютерное зрение
Normalize() Нормализация данных Табличные данные
Categorify() Кодирование категориальных признаков Табличные данные
FillMissing() Заполнение пропусков Табличные данные
Tokenize() Токенизация текста NLP
Numericalize() Преобразование токенов в числа NLP

Метрики

Метрика Описание Область применения
accuracy Точность классификации Классификация
error_rate Частота ошибок Классификация
top_k_accuracy Точность в топ-k Классификация
Dice() Коэффициент Dice Сегментация
JaccardCoeff() Коэффициент Жаккара Сегментация
F1Score() F1-мера Классификация
Precision() Точность Классификация
Recall() Полнота Классификация
rmse Среднеквадратичная ошибка Регрессия
mae Средняя абсолютная ошибка Регрессия
R2Score() Коэффициент детерминации Регрессия
exp_rmspe Экспоненциальная RMSPE Регрессия

Callbacks

Callback Описание Назначение
EarlyStoppingCallback Ранний останов обучения Предотвращение переобучения
SaveModelCallback Сохранение лучших весов Сохранение прогресса
ReduceLROnPlateau Уменьшение LR при плато Оптимизация обучения
CSVLogger Логирование в CSV Мониторинг обучения
WandbCallback Интеграция с Weights & Biases Эксперименты
TensorBoardCallback Интеграция с TensorBoard Визуализация
GradientClip Обрезка градиентов Стабилизация обучения
MixUp Применение MixUp аугментации Улучшение генерализации

Функции потерь

Функция потерь Описание Область применения
CrossEntropyLossFlat Кросс-энтропия (плоская) Классификация
MSELossFlat Среднеквадратичная ошибка Регрессия
L1LossFlat Средняя абсолютная ошибка Регрессия
BCEWithLogitsLossFlat BCE с логитами Бинарная классификация
LabelSmoothingCrossEntropy Кросс-энтропия со сглаживанием Классификация
FocalLoss Focal Loss Несбалансированная классификация
DiceLoss Dice Loss Сегментация

Примеры реальных применений

Медицинская диагностика

# Классификация рентгеновских снимков
path = Path('chest_xray_data')
dls = ImageDataLoaders.from_folder(
    path, train='train', valid='test',
    item_tfms=Resize(224),
    batch_tfms=aug_transforms(size=224, min_scale=0.8)
)

learn = vision_learner(dls, resnet50, metrics=[accuracy, F1Score()])
learn.fine_tune(5)

# Интерпретация результатов
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()

Анализ настроений в отзывах

# Классификация отзывов на положительные/отрицательные
path = untar_data(URLs.IMDB)
dls = TextDataLoaders.from_folder(path, valid='test')

learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5)
learn.fine_tune(4, 1e-2)

# Предсказание на новом тексте
text = "This movie was absolutely fantastic!"
pred = learn.predict(text)
print(f"Prediction: {pred[0]}, Confidence: {pred[2][pred[1]]:.4f}")

Сегментация спутниковых изображений

# Сегментация земельных участков
path = Path('satellite_data')
codes = ['background', 'building', 'road', 'water', 'vegetation']

dls = SegmentationDataLoaders.from_label_func(
    path, bs=4, fnames=get_image_files(path/"images"),
    label_func=lambda o: path/"masks"/f"{o.stem}.png",
    codes=codes,
    item_tfms=Resize(512),
    batch_tfms=aug_transforms(size=512, min_scale=0.75)
)

learn = unet_learner(dls, resnet34, metrics=Dice())
learn.fine_tune(10)

Рекомендательная система

# Система рекомендаций фильмов
path = untar_data(URLs.ML_100k)
ratings = pd.read_csv(path/'u.data', delimiter='\t', 
                     names=['user','movie','rating','timestamp'])

dls = CollabDataLoaders.from_df(ratings, item_name='movie', 
                               rating_name='rating', user_name='user')

learn = collab_learner(dls, n_factors=100, y_range=(0.5, 5.5))
learn.fit_one_cycle(10, 5e-3)

# Получение рекомендаций
movie_factors = learn.model.i_weight.weight
user_factors = learn.model.u_weight.weight

Часто задаваемые вопросы

Что такое fastai и чем она отличается от PyTorch?

fastai — это высокоуровневая библиотека, построенная поверх PyTorch, которая предоставляет упрощенный интерфейс для создания и обучения нейронных сетей. Основные отличия:

  • Простота использования: fastai позволяет достичь отличных результатов в несколько строк кода
  • Встроенные best practices: автоматическое применение современных техник обучения
  • Готовые архитектуры: большой выбор предобученных моделей
  • Интегрированные инструменты: визуализация, интерпретация, деплой

Подходит ли fastai для начинающих?

Да, fastai специально разработана для упрощения входа в машинное обучение. Библиотека позволяет:

  • Сосредоточиться на решении задач, а не на технических деталях
  • Изучать машинное обучение на практических примерах
  • Постепенно углубляться в детали реализации

Можно ли использовать свои модели PyTorch в fastai?

Да, fastai полностью совместима с PyTorch. Вы можете:

  • Использовать любые PyTorch модели в качестве основы
  • Комбинировать fastai компоненты с PyTorch кодом
  • Постепенно мигрировать с PyTorch на fastai или наоборот

Какие типы задач поддерживает fastai?

fastai поддерживает широкий спектр задач машинного обучения:

  • Компьютерное зрение: классификация, сегментация, детекция объектов
  • NLP: классификация текста, языковое моделирование, генерация
  • Табличные данные: классификация, регрессия
  • Рекомендательные системы: коллаборативная фильтрация
  • Временные ряды: прогнозирование, аномалии

Есть ли поддержка GPU в fastai?

Да, fastai автоматически использует GPU, если он доступен. Библиотека поддерживает:

  • Автоматическое определение и использование CUDA
  • Mixed precision training для ускорения обучения
  • Мультиг-GPU обучение
  • Оптимизацию памяти GPU

Как развернуть обученную модель в продакшене?

fastai предоставляет несколько способов деплоя:

  • Экспорт в .pkl: простой способ сохранения модели
  • ONNX экспорт: для кросс-платформенного использования
  • Веб-интерфейсы: интеграция с Gradio, Streamlit
  • API сервисы: развертывание через FastAPI, Flask
  • Мобильные приложения: экспорт для iOS/Android

Можно ли использовать fastai для исследований?

Да, fastai активно используется в исследованиях. Библиотека предоставляет:

  • Гибкость для экспериментов
  • Возможность кастомизации всех компонентов
  • Интеграцию с системами трекинга экспериментов
  • Воспроизводимые результаты

Заключение

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

Ключевые преимущества fastai:

Скорость разработки: Благодаря высокоуровневому API и встроенным best practices, разработка моделей происходит значительно быстрее.

Качество результатов: Автоматическое применение современных техник обучения позволяет достигать state-of-the-art результатов.

Образовательная ценность: Библиотека отлично подходит для изучения машинного обучения благодаря четкой структуре и обширной документации.

Производственная готовность: Встроенные инструменты для интерпретации, валидации и деплоя делают переход от прототипа к продакшену более плавным.

Активное сообщество: Большое и активное сообщество разработчиков постоянно развивает библиотеку и предоставляет поддержку.

fastai продолжает эволюционировать, регулярно внедряя новейшие достижения в области машинного обучения и делая их доступными для широкой аудитории разработчиков. Это делает библиотеку отличным выбором как для образовательных проектов, так и для решения реальных бизнес-задач.

Новости