Pix2pix implementation report
Yet another reason to make sure that I don't like GANs
Created on December 18|Last edited on December 21
Comment
- Исходная статья
- Репозиторий с кодом (временно недоступен)
Много тут странностей, конечно. Давайте разбираться.
В качестве первого датасета я решил использовать карты и обучаться предсказывать по спутниковому снимку гуглокарту.

Пример из датасета
Началось все с того, что я воспользовался авторским UNet'ом и обучал его с L1-loss'ом. Параметры обучения по большей части были взяты из статьи, но как позже выяснилось - не все. На этом этапе я не логировал картинки и наслаждался графиками лоссов, пытался разобраться как правильно быть с гиперпараметрами. Что-то училось.
Далее выяснилось что все не так. И нормировать картинки надо не по их статистикам, а в [-1, 1], и tanh к модели прикрутить, и батчсайз 1 (видимо регуляризация такая). В общем, все не то. Была проделана новая итерация кодинга и протестированы модели. На этот раз начал рисовать картинки (лучше бы не начинал). Вы только посмотрите на эти прекрасные реки, поля и озера! На эти удивительные графики!
По какой-то неизвестной мне причине модель с первой итерации рисовала белое изображение. Я так и не разобрался в чем дело. Просто переписал UNet и ура! Эту версию в качестве первого чекпоинта я и отправил.
Ганы
Гадкие и Абсолютно Неработающие
Вообще, меня обычно смущают методы, которые при имплементации хоть сколько-нибудь отличной от авторской перестают работать. Поэтому я обычно стараюсь избегать архитектуры, которые "надо уметь готовить". Но спасибо БДЗ-3, мы встретились.
Тут с экспериментами ход разработки был не такой захватывающий. Просто добавил дискриминатор и лоссы как в статье, немного модифицировал цикл обучения, сделал подсчет ФИДа и восхитительное логгирование. Смотрим!
Я бы сказал, в этом случае нас постиг успех. Ган разве что стрелочки на дорогах рисовать не научился. И, конечно, спорит где рисовать парки, а где нет (и я с ним обычно согласен).
Шрек
Второй датасет я решил сделать интереснее, чем то, что предлагали авторы. Сначала я хотел искать на картинке Робертов Патиссонов, но не справился хорошо переформулировать задачу для Pix2Pix и продумать взаимоотношения генераторов и дискриминаторов. Поэтому пошел по более простому пути - решил раскрашивать Шрека. На ютубе есть замечательное видео: "Shrek but every time he takes a STEP it gets 5% faster". Я разбил его на кадры и семплил их с возрастающей частотой. В итоге получился датасет из 7600 картинок в разрешении 640х360. Из был получен его черно-белый брат близнец. Задача нашей сетки - раскрасить шреков (а так же других персонажей и просто картинки). Обучал на этом 50 эпох, остальные гиперпараметры остались примерно как в статье. Сравнил adversarial обучение и просто L1-loss. Смотрим!
Судя по ФИДу, наш ган проиграл L1. Судя по картинкам, никто так и не научился раскрашивать подсолнухи и драконов. Судя по времени, завтра я не высплюсь.
Похоже, у нас слишком умный дискриминатор, который забуллил генератора и не позволил учиться. Можно попробовать испольлзовать SGD вместо адама, уменьшить ему learning rate или какие-нибудь еще гановые трюки. Но все это как-то душно и не добежит до дедлайна. Поэтому смотрим на синих шреков и радуемся, что хоть такие есть.
Выводы
Мне всегда было интересно почему ганы еще живы, если есть диффузионки. А потом мне предложили выбрать между этими методами для решения примерно одной задачи. И я выбрал ганы. Считаю эту ДЗ полезной именно потому, что я сам дал ответ на свой вопрос.
Add a comment