Skip to main content

Отчет по дз-2 DGM (StarGan + улучш)

Created on March 11|Last edited on March 11

Мой топ багов этой домашки:

  • Сразу несколько цветов волос генерил
  • Делал степ оптимайзера по перменной "шаг", а не "эпоха"
  • Перевел модель в eval навсегда

Общее

  • Железка: в основном 2080 TI
  • BS=32, картинки 128x128 (для ориг статьи BS=16)
  • Использовал 5 атрибутов как в статье: 3 цвета волос, Young, Male.

1) Оригинальная статья

Короче я делал все ровно как в статье. Взял 5 атрибутов: 3 цвета волос, Young, Male. Внизу сгенерированных картинок подпись. Если ее нет, это значит Female + Old. Если нет Male, то там Female и тд. Единсвтенное отличие это то, что я рандомно генерировал метки, а не шаффлил их.
Для реализации статьи я подчерпнул из оригинального кода следующие моменты:
0) Порядок обучения генератора и дискриминатора
1) bias=False почти во всех свертках
2) Res block оказался из CycleGAN, а именно: Conv, IN, ReLU, Conv, IN (хотя из статьи могло показаться Conv, IN, ReLU)

Run set
1

Как можно заметить картинки генерятся очень плохие. Сетка училась пару эпох. Как потом выяснилось, картинки настолько плохие потому, что из-за IN надо генерировать картинки в режиме model.train(). Также у сетки все еще был большой Reconstruction loss, то есть картинки в целом были не похожи.
Я пробовал учить Res Block как в статье написано, крутить бачсайз, учить дольше и многое другое. Возможно, что если учить сетку реально 20 эпох как говорят авторы, она будет генерировать лучше картинки:

Run set
3

В общем тут все метрики менялись очень-очень медленно.

2) Про FID

Далее я реализовал подсчет FID - взял из прошлой домашки код. Реализацию подгрузки InceptionV3 (с весами из PyTorch) я стырил с гитхаба (https://github.com/mseitzer/pytorch-fid/blob/master/src/pytorch_fid/inception.py)

3) Далее об экспериментах

Я считаю, что у меня получилось предложить улучшения, которые привели к лучшему качеству и более быстрому обучению. Далее я их опишу
1) Заменяем IN на BN. Поскольку в оригинальной статье нормы только в генераторе, то мы можем их заменить (в критике использовать BN как мы знаем нельзя). Также я вместил на карту BS=32, взял LR в 2 раза больше и все это назвал базовый ран:

Run set
2

На графиках выше видно, что здесь Reconstruction Loss сразу ушел ниже, что дало более красивые картинки. Также видно, что значиения общих лоссов оба около 0, а для ориг статьи были около -5. Я еще привел FID (но только на новом бейзлайне). Он порядка 20-21. Качественные примеры:

Run set
1

Далее посмотрим на следующие изменения:
1) Замена ConvTranspose на Upsample + Transpose
2) 1) + Augmentations (много)
3) 1) + Augmentations (мало)
Рисую ниже FID и картинки (по этим картинкам мало что можно понять, но в целом посмотреть на случайные сэмплы из каждой модели)


Run set
4

Видно по графику, что модели с аугментациями проигрывают. Стоит отметить, что я FID считаю тоже на аугментированных картинках. Возмонжо, если подольше поучить получатся лучше картинки для моделей с аугментациям.
И тут мне рассказали, что в коде авторы усредняли CLS loss по другому. То есть он усреднялся только по батчу, а по кол-ву аттрибутов не усреднялся. По итогу это эквивалентно тому, что я всегда брал 0.2 CLS лоссов. Я помножил эти лосы на 5 и обучил несколько моделей по-быстрому т.к. скоро дедлайн. И как можно было догадаться модели стали лучше менять атрибуты (более явно) и хуже рисовать картинки (более размыто). Вот наглядные примеры (на примере видно, как в первой строке у мужчины очень белые волосы, чего мы раньше не видели в примерах; однако картинки сильно более размытые - чего и следовало ожидать).
Далее я покажу результаты для 3 моделей:
Каджая из них как я выяснил в экспериментах выше имеет оригинальную архитектуру StarGan, но имеет BN вместо IN, BS=32, LR=0.0002, Upsample+Conv вместо ConvTranspose.
1) Baseline (описана выше)
2) Baseline & CLS_LOSS * 5
3) Baseline & CLS_LOSS * 5 & Augmentations

Run set
3

На картинках выше отчетливо видно, что нижний ряд (без перевзвеса CLS лосса) картинки более четкие, но изменения почти незаметны. На верхнем ряду (с перевзвесом) картинки менее четкие, но изменения более качественные и лучше видны. Это подтверждается и метрикой FID: у нижнего рана она меньше (т.к. не учитывает сами изменения).
Во втором же ряду картинки очень сильно размыты из-за аугментаций. Вероятно, надо сильно дольше учить такую модель.

Финальные cherry pick'и

Из моделей без аугов я начеррипикал ниже. 1 это модель с CLS_LOSS * 5, а вторая без перевзвеса. Опять же, разница видна - вторая модель модее консервативна и получает лучше качество и FID, но хуже делает преобразования. Я бы выбрал первую (но надо доучить)
CLS_LOSS * 5
BASE (CLS_LOSS * 1)
Итог: Получилась работа по отлавливанию багов и непонятных описаний авторов в статье. Однако попробовал несколько изменений типа Upsample, BN еще пробовал учить чисто архитектуру авторов и разные BS, LR, добавлять аугментации. И получились неплохие картинки!
Настоящий итог: куча багов и рейджа; интересные вещи типа IN в критике и спектральной нормализации попробовать не успел =(
ненавижу DL



Бонус!!!! Хорошие/смешные примеры!



Брови перекрасились в черный. Считаю прикольно

У этого парня будто косметика!