Original size 1140x1600

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

PROTECT STATUS: not protected
1
The project is taking part in the competition

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

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

big
Original size 512x512

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

big
Original size 428x291

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

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

Original size 753x251

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

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

Original size 559x132

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

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

Original size 647x88

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

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

Original size 858x430

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

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

Original size 679x99

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

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

Original size 454x137

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

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

Original size 566x181

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

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

Original size 523x26

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

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

Original size 639x217

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

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

Original size 883x349

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

Передала изображения на устройство. Преобразовала их в латентное пространство через 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 ()).

Original size 458x104

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

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

Original size 576x144

13. Завершение обучения Зачем: Чтобы сохранить финальную версию модели. Что я сделала:

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

Original size 1493x559

14. Вывод итоговой информации Зачем: Чтобы пользователь знал, сколько времени заняло обучение и где найти финальные веса. Что я сделала:

Вывела сообщение с временем обучения и путь к конечным файлам.

Итоговый результат

Original size 512x512
0
Original size 512x512

Итог

Природные молнии формируются вследствие сложных метеорологических процессов, которые создают уникальные разряды с особым путём и структурой. Каждый раз, когда происходит молния, её форма, траектория и детали отличаются, что делает каждое изображение уникальным.

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

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

Кроме того, молнии — очень хаотичные явления, подверженные влиянию множества переменных. Мелкие изменения условий могут привести к совершенно разным формам и траекториям. Такая высокая степень непредсказуемости затрудняет точное воспроизведение.

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

В итоге, несмотря на достижения в области ИИ и генеративных моделей, полностью воспроизвести природный рисунок молний невозможно из-за их уникальной, сложной и хаотичной природы, а также недостатка данных и физического моделирования. ИИ способен лишь создавать приближённые изображения, в стиле или напоминающие реальные молнии, но не точные копии.

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