Исходный размер 1140x1600

lightning bolt \\ Обучение генеративной нейросети

Описание идеи

Молнии очень непредсказуемое природное явление. Просто так ты никогда не сможешь определить, куда и когда она ударит. Но самое непредсказуемое — это её форма. Изгибы, которые как снежинки отличаются одна от другой.

big
Исходный размер 512x512

Принцип работы кода

big
Исходный размер 428x291
  1. Монтирование Google Drive Зачем: Чтобы иметь доступ к своим файлам и папкам, хранящимся в Google Drive, и сохранять результаты обучения там. Что я сделала:

Проверила, подключён ли диск по пути /content/drive/MyDrive. Если не подключён — вызвала функцию drive.mount() для подключения.

Исходный размер 753x251
  1. Определение конфигурации обучения Зачем: Чтобы централизованно настроить параметры обучения, такие как пути к данным, размер изображений, гиперпараметры, моделевые параметры и др. Что я сделала:

Создала словарь CONFIG, в котором указала все нужные параметры, например: путь к папке с изображениями, название модели, размеры, скорость обучения, количество эпох и других.

Исходный размер 559x132
  1. Определение устройства и типа данных Зачем: Чтобы использовать GPU для быстрого обучения, если он доступен, и выбрать правильный тип данных для оптимизации. Что я сделала:

Проверила наличие cuda (torch.device('cuda')) или использовала CPU (torch.device('cpu')). В зависимости от этого выбрала тип данных (float16 для cuda для ускорения и снижения потребления памяти, float32 для cpu). Установила сид (seed) для воспроизводимости обучения.

Исходный размер 647x88
  1. Создание функции gather_images() Зачем: Чтобы собрать все пути к изображениям внутри заданной папки и её подпапок, чтобы позже использовать их для загрузки данных. Что я сделала:

Прошлась по папке с помощью os.walk(), собрала все файлы с допустимыми расширениями (.png, .jpg, .jpeg, .webp), чтобы иметь список всех изображений.

Исходный размер 858x430
  1. Создала класс LightningDataset Зачем: Чтобы удобно управлять датасетом изображений и их текстовых подсказок, а также подготовить их для подачи в модель. Что я сделала:

В конструкторе класса: Нашла все пути к изображениям в папке. Перемешала список файлов произвольно для рандомизации. Ограничила общее количество изображений по лимиту (limit). Создала серию преобразований изображений — изменение размера, преобразование в тензор и нормализация. В методе getitem(): Загружала изображение. Применяла преобразования. Возвращала словарь из изображения и текста.

Исходный размер 679x99
  1. Подготовка к обучению: создание датасета и DataLoader Зачем: Чтобы обеспечить эффективную подачу данных в модель по батчам с возможностью перетасовки. Что я сделала:

Создала объект LightningDataset, указав папку с изображениями. Создала DataLoader, который подает батчи изображений и подсказок во время тренировки.

Исходный размер 454x137
  1. Загрузка предобученной модели Зачем: Чтобы использовать уже обученную модель Stable Diffusion в качестве основы, на которую будут добавляться настройки LoRA. Что я сделала:

Загрузила модель через DiffusionPipeline, указав название нужной предобученной модели. Отключила встроенные проверки безопасности — чтобы ускорить обучение. Переместила модель на выбранное устройство (cuda или cpu).

Исходный размер 566x181
  1. Подготовка модели для обучения LoRA Зачем: Чтобы сделать модель способной адаптироваться к новым данным, сохраняя при этом основные параметры. Что я сделала:

Взяла unet из пайплайна — основную часть модели диффузии. Создала конфигурацию LoRA с помощью LoraConfig, указав параметры размерности, имя, масштаб и др. Обернула unet в get_peft_model(), чтобы применить LoRA — это добавит обучаемые низкоранговые матрицы.

Исходный размер 523x26
  1. Настройка оптимизатора Зачем: Чтобы обновлять параметры модели во время обучения. Что я сделала:

Создала AdamW для параметров модели (model.parameters()), установив скорость обучения.

Исходный размер 639x217
  1. Начало цикла обучения Зачем: Чтобы пройтись по всем обучающим данным, обновляя веса модели при помощи градиентных методов. Что я сделала:

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

Исходный размер 883x349
  1. Обработка каждого батча Зачем: Чтобы подготовить входные данные, провести обучение, посчитать ошибку и обновить модель. Что я сделала:

Передала изображения на устройство. Преобразовала их в латентное пространство через VAE (encode(), latent_dist.sample()) и масштабировала их (* 0.18215). Токенизировала и закодировала подсказки (tokenize() и encode()), чтобы получить эмбеддинги текста. Создала шум (noise) и выбрала случайное время t для процесса диффузии (sample_t()). Внесла шум в латенты с помощью add_noise(). Передала зашумленные латенты и временные параметры в модель — она предсказывает шум (model(noisy_latent, timesteps=t)). Посчитала потерю как разницу между предсказанным и реальным шумом (MSE). Обнулила градиенты (optimizer.zero_grad()), произвела обратное распространение (loss.backward()), и обновила параметры (optimizer.step()).

Исходный размер 458x104
  1. Сохранение контрольных точек Зачем: Чтобы иметь возможность вернуться к успешной точке обучения. Что я сделала:

Каждые save_interval шагов создавала папку и сохраняла веса модели (save_pretrained()).

Исходный размер 576x144
  1. Завершение обучения Зачем: Чтобы сохранить финальную версию модели. Что я сделала:

После достижения max_steps — создала папку final и сохранила финальные веса модели.

lightning bolt \\ Обучение генеративной нейросети
Проект создан 09.11.2025
Мы используем файлы cookies для улучшения работы сайта НИУ ВШЭ и большего удобства его использования. Более подробную...
Показать больше