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

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

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

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

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

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

Исходный размер 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 и сохранила финальные веса модели.

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

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

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

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

Итог

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

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

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

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

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

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

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