Данные храняться в дириктории data, а именно monet и photo
monet - это разные картины, photos - это фотографии реального мира
Все изображения формата jpg и размером (256, 256, 3)
data/extract_data - храниться класс для работы с данными
data/data.csv информация, о файлах (их название, расположение)
data/monet - изображения картин
data/photo - изображения фотографий реального мира
models.py находятся функции и классы нейронных сетей, а именно:
В данном генераторе я использовал свёрточные слои VGG16, заморозил их, чтобы обучать меньше параметров.
Обучение я проводил в Сolab. Обучал на GPU вышло примерно 170 минут на обучение 100 мини эпох. Мини эпоха - это 1/10 полной эпохи, было это создано ради более детального наблюдения, как обучается сеть.
Первое время генератор сводил любой результат к черному экрану. Проблема оказалось в discriminator, так как первый вариант сводил размерность к (batch, 1), потом я нашел решение, оказалось в том что надо сводить например к (batch, size, size, 1), где я сводил размерность к (16,16,1). Идея заключаться в том, что мы рассматриваем изображение кусочками. Такой подход решил проблему черного экрана. Вторая проблема описана в гипотезе 2.
Слои VGG16 позволили не только сходиться быстрее, но и находить более четки границы обектов.
Instance Normalization(IN) - позволяет избавиться от сетки, которая появлялась при обучении без IN. Пример с сеткой, это первый хороший результат, который выдала НС без Instance Normalization. Сходимость к более-менее хорошему результату была очень быстро. Правда клетка мешала.
Из-за ограничения в мощности Colab падал с ошибкой, если использовать Instance Normalization после concatenate. Ошибка связана с ограничением в оперативной памяти. Но в финальном варианте, когда я аккуратно подобрал параметры м расположение IN – это мне позволило мне обучать модель.
dcgan.mp4
Есть много очень хороших и есть много очень плохих. Во время обучения с IN - сразу стало заметно, что сетка почти пропала.
При инициализации весов и при использовании обученных параметров VGG16 сразу стало понятно, что очертания объектов видны, а как только убрать обученные веста, то сразу появлялся хаус при инициализации. Пример на 0 эпохе(до обучения) при обученных VGG16 весах и без IN:
В проекте я был ограничен в производительности, но я хотел бы увеличить маштаб, добавить веса discriminator-у, и после выхода vgg16, тоже применять нормализацию. А также, расширить генератор сходя MaxPool всё глубже и глубже, чтобы генератор лучше обращал на детали изображения. И возможно даже позволит решить очень навощившую проблему с артефактами. Таких артефактов очень много, а также обучать модель гораздо дольше. Пример: