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

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

1. Монтирование Google Drive Зачем: Чтобы иметь доступ к своим файлам и папкам, хранящимся в Google Drive, и сохранять результаты обучения там. Что я сделала:
Проверила, подключён ли диск по пути /content/drive/MyDrive. Если не подключён — вызвала функцию drive.mount () для подключения.
2. Определение конфигурации обучения Зачем: Чтобы централизованно настроить параметры обучения, такие как пути к данным, размер изображений, гиперпараметры, моделевые параметры и др. Что я сделала:
Создала словарь CONFIG, в котором указала все нужные параметры, например: путь к папке с изображениями, название модели, размеры, скорость обучения, количество эпох и других.
3. Определение устройства и типа данных Зачем: Чтобы использовать GPU для быстрого обучения, если он доступен, и выбрать правильный тип данных для оптимизации. Что я сделала:
Проверила наличие cuda (torch.device ('cuda')) или использовала CPU (torch.device ('cpu')). В зависимости от этого выбрала тип данных (float16 для cuda для ускорения и снижения потребления памяти, float32 для cpu). Установила сид (seed) для воспроизводимости обучения.
4. Создание функции gather_images () Зачем: Чтобы собрать все пути к изображениям внутри заданной папки и её подпапок, чтобы позже использовать их для загрузки данных. Что я сделала:
Прошлась по папке с помощью os.walk (), собрала все файлы с допустимыми расширениями (.png, .jpg, .jpeg, .webp), чтобы иметь список всех изображений.
5. Создала класс LightningDataset Зачем: Чтобы удобно управлять датасетом изображений и их текстовых подсказок, а также подготовить их для подачи в модель. Что я сделала:
В конструкторе класса: Нашла все пути к изображениям в папке. Перемешала список файлов произвольно для рандомизации. Ограничила общее количество изображений по лимиту (limit). Создала серию преобразований изображений — изменение размера, преобразование в тензор и нормализация. В методе getitem(): Загружала изображение. Применяла преобразования. Возвращала словарь из изображения и текста.
6. Подготовка к обучению: создание датасета и DataLoader Зачем: Чтобы обеспечить эффективную подачу данных в модель по батчам с возможностью перетасовки. Что я сделала:
Создала объект LightningDataset, указав папку с изображениями. Создала DataLoader, который подает батчи изображений и подсказок во время тренировки.
7. Загрузка предобученной модели Зачем: Чтобы использовать уже обученную модель Stable Diffusion в качестве основы, на которую будут добавляться настройки LoRA. Что я сделала:
Загрузила модель через DiffusionPipeline, указав название нужной предобученной модели. Отключила встроенные проверки безопасности — чтобы ускорить обучение. Переместила модель на выбранное устройство (cuda или cpu).
8. Подготовка модели для обучения LoRA Зачем: Чтобы сделать модель способной адаптироваться к новым данным, сохраняя при этом основные параметры. Что я сделала:
Взяла unet из пайплайна — основную часть модели диффузии. Создала конфигурацию LoRA с помощью LoraConfig, указав параметры размерности, имя, масштаб и др. Обернула unet в get_peft_model (), чтобы применить LoRA — это добавит обучаемые низкоранговые матрицы.
9. Настройка оптимизатора Зачем: Чтобы обновлять параметры модели во время обучения. Что я сделала:
Создала AdamW для параметров модели (model.parameters ()), установив скорость обучения.
10. Начало цикла обучения Зачем: Чтобы пройтись по всем обучающим данным, обновляя веса модели при помощи градиентных методов. Что я сделала:
Задала переменные для отслеживания общего количества шагов, времени обучения и прогресса.
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 ()).
12. Сохранение контрольных точек Зачем: Чтобы иметь возможность вернуться к успешной точке обучения. Что я сделала:
Каждые save_interval шагов создавала папку и сохраняла веса модели (save_pretrained ()).
13. Завершение обучения Зачем: Чтобы сохранить финальную версию модели. Что я сделала:
После достижения max_steps — создала папку final и сохранила финальные веса модели.
14. Вывод итоговой информации Зачем: Чтобы пользователь знал, сколько времени заняло обучение и где найти финальные веса. Что я сделала:
Вывела сообщение с временем обучения и путь к конечным файлам.
Итоговый результат
Итог
Природные молнии формируются вследствие сложных метеорологических процессов, которые создают уникальные разряды с особым путём и структурой. Каждый раз, когда происходит молния, её форма, траектория и детали отличаются, что делает каждое изображение уникальным.
Ограничения данных и обучающих примеров также играют важную роль. ИИ учится на существующих данных, и если в обучающей выборке отсутствуют все возможные вариации молний или их редкие формы, модель не сможет точно воссоздать или сгенерировать столь же сложные и уникальные узоры.
Модель также не полностью моделирует физику возникновения молний. Эти разряды — результат физических процессов, связанных с электрическими разрядами в атмосфере. Современные ИИ используют в основном статистические и визуальные признаки, а не полноценное моделирование физических механизмов, что ограничивает их способность создавать абсолютно точные изображения.
Кроме того, молнии — очень хаотичные явления, подверженные влиянию множества переменных. Мелкие изменения условий могут привести к совершенно разным формам и траекториям. Такая высокая степень непредсказуемости затрудняет точное воспроизведение.
Также сложно сохранить мельчайшие детали и тонкие линии, которые делают каждую молнию уникальной. Даже самые современные генеративные модели не всегда способны точно воспроизвести все тонкие элементы и сложные узоры, особенно если эти вариации редки или необычны.
В итоге, несмотря на достижения в области ИИ и генеративных моделей, полностью воспроизвести природный рисунок молний невозможно из-за их уникальной, сложной и хаотичной природы, а также недостатка данных и физического моделирования. ИИ способен лишь создавать приближённые изображения, в стиле или напоминающие реальные молнии, но не точные копии.