Original size 1140x1600

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

PROTECT STATUS: not protected

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

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

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 \\ Обучение генеративной нейросети
We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more