Банановая команда: Манар Сафи, Никита Гириш, Хершал Бхатиа

Калифорнийский университет в Беркли

CS194: Проектирование, визуализация и понимание глубоких нейронных сетей

Проблема и предыстория

Задача использования GAN для синтеза четких изображений изучалась в недавней литературе [1][2]. Чтобы исследовать проблему преобразования изображения в изображение, лаборатория BAIR Labs в Беркли исследовала, как можно использовать GAN для создания изображения, обусловленного другим [1]. Их модель «pix2pix» могла выполнять такие преобразования изображений, как преобразование дневного изображения в такое же изображение в ночное время или преобразование изображения в градациях серого в цветное изображение. Их модель также могла раскрашивать изображения с соответствующих краев. Пока они тренировались на реальных, реалистичных изображениях, мы решили, что было бы интересно расширить эту идею до раскрашивания скетчей из мультфильмов. Два наших вопроса заключались в том, будет ли этот GAN эффективно раскрашивать мультфильмы, а затем сможет ли обученный GAN обобщить, чтобы раскрасить мультфильмы, которые не похожи на набор обучающих данных.

Хорошо известно, что нейронные сети плохо работают на тестовых выборках, которые не происходят из того же «распределения», что и набор поездов, на котором обучалась нейронная сеть. В этом проекте мы тренировались на эскизах изображений из CartoonSet, созданного Google [4], и просили модель раскрашивать эскизы совершенно разных изображений, которые в этой статье мы называем «набором обобщения». Мы хотели выяснить, можем ли мы пожертвовать производительностью на проверочном наборе из CartoonSet, чтобы получить лучшие результаты на обобщающем наборе. Мы оценили производительность нашей модели визуально.

Подход

CartoonSet — это набор данных из более чем 10 000 2D-мультфильмов с лицами. Каждое лицо представляет собой комбинацию случайных черт (таких как форма глаз, носа, прическа), атрибутов (таких как волосы, глаза, цвет лица) и пропорций лица. Функции исходят из 10 возможных категорий художественных работ, 4 художественных стилей и 4 цветовых категорий, которые объединяются для создания полного набора данных [4]. Чтобы подготовить набор данных для преобразования краев в мультфильм, мы запустили детектор краев для каждого изображения в наборе данных. Процесс визуализируется ниже.

В документе Image-to-Image [1] модель GAN описывается как минимизирующая минимаксные потери, как мы видели в лекции. Однако вместо того, чтобы минимизировать эту потерю, модель пытается только максимизировать отрицательное значение прогнозируемо-фальшивой потери. Это изменение точно резюмируется как:

где для наших целей x — входной эскиз, y — цель, а z — случайный вектор.

Наша базовая модель — это то, что представлено в исходной модели pix2pix из [1][3], которая сама в значительной степени заимствована из модели из статьи DCGAN [2]. Эта модель имеет архитектуру U-Net для генератора и дискриминатора PatchGan[1]. Визуальное представление генератора базовой модели приведено здесь:

Этот генератор представляет собой сверточную нейронную сеть с 8 слоями как в компонентах кодирования, так и в компонентах декодирования. Каждый слой уменьшает размеры изображения вдвое (кодировщик) или удваивает их (декодер). Архитектура U-Net является улучшением благодаря включению пропускных соединений, которые передают информацию от уровня кодирования к соответствующему уровню декодирования, чтобы декодер мог учитывать, как должно выглядеть выходное изображение на каждом этапе декодирования. процесс. Pix2Pix использует потери L1, чтобы уменьшить размытость выходного изображения, к которой часто может привести потеря L2.

После тестирования базовой модели на нашем обучающем наборе данных, а затем на более общих мультфильмах, мы пришли к выводу, что мы склонны к переобучению (подробнее об этом в разделе результатов). Мы предложили и внесли две модификации в эту базовую линию в попытке восполнить потерю общности. Во-первых, изменить функцию потерь на L2 вместо L1. Мы ожидали, что L2 будет создавать более размытые изображения, но нам было любопытно посмотреть, сможет ли он лучше обобщать.

Цель второго предложения состояла в том, чтобы смягчить переоснащение pix2pix за счет уменьшения сложности модели. Мы сократили количество слоев в генераторе, существенно сжав нейронную сеть. Модель визуализирована ниже.

В этой модели мы кодируем/декодируем в четыре раза вместо двух. Мы ожидали, что это изменение структуры модели повлияет на результаты больше, чем изменение функции потерь, потому что потери L2 довольно близки к потерям L1, а структурные изменения более радикальны. В следующем разделе мы обсудим результаты наших экспериментов.

Результаты и анализ

Сначала мы тренировались на CartoonSet с предварительно построенной моделью, предоставленной в исследовательской работе BAIR. Используя большинство гиперпараметров по умолчанию с Lambda = 100, мы обнаружили, что модель способна эффективно обучаться раскрашиванию мультфильмов. Мы тренировались на двух подмножествах: одно со 100 обучающими образцами, выбранными случайным образом из исходных 10 000, а другое — с 1000. Затем мы попросили модели раскрасить отложенный проверочный набор (опять же, выбранный случайным образом, но со 100 изображениями) из CartoonSet. . Результаты набора проверки отображаются здесь:

Разница между результатами поезда-100 и поезда-1000 очевидна. В «Поезде-100» (слева) мы видим, что GAN неправильно окрашивает лица и волосы и имеет тенденцию окрашивать все лица в один цвет. На тех же изображениях мы видим, что «Поезд-1000» (справа) раскрасил лица и волосы почти так же, как у мишени. Выходные данные в Train-100 также имеют некоторое размытие, особенно вокруг глаз, тогда как выходные данные в Train-1000 имеют гораздо большую четкость.

Кроме того, было интересно увидеть, как некоторые недостатки детектора краев не повлияли на производительность модели в целом. Например, на третьем изображении верхняя часть очков девушки полностью исключена, а у человека на первом изображении нет бровей, но модель может заполнить эти части практически без проблем. Еще одна интересная особенность модели заключается в том, что она создает гетерохромию (разный цвет глаз) в мультфильмах, которой не было в наборе данных. Наша гипотеза состоит в том, что лица с другими похожими чертами были поровну разделены между голубыми и карими глазами, а это означало, что модель выбрала один голубой и один карий глаз, чтобы минимизировать среднюю потерю. Оба эти атрибута указывают на переобучение в нашей модели. Брови, снова появляющиеся на выходном изображении, говорят о том, что модель не может обобщаться на эскизы с редкими/отсутствующими бровями.

Мы согласились, что модель для обучения на 1000 изображений показала себя очень хорошо, поэтому в оставшейся части проекта мы сосредоточим нашу модель только на обучении на 1000 изображениях. Результаты компонентов потерь по отношению к обучающим итерациям (более 200 эпох) показаны ниже:

Как обсуждалось выше, модель пытается максимизировать функцию потерь для generator_loss_GAN. Действительно, срок убытка увеличивается со временем. Потери в generator_loss_L1 умножаются на коэффициент Lambda=100, что дает его вклад того же порядка, что и потери генератора.

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

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

Первой модификацией, которую мы попробовали в нашей модели, было изменение функции потерь с штрафа L1 на штраф L2. Мы знали от Isola и др., что «L2 дает размытые результаты в задачах генерации изображений», потому что не может создать четкую локальную структуру [1]. Потери L1 несколько смягчают эту проблему, но все еще страдают от размытых выходных данных. Однако мы предположили, что, переключившись на потерю L2, мы получим худшие результаты на проверочном наборе CartoonSet, но поскольку потеря L2 способствует размытию, мы получим лучшие результаты на наборе обобщения. Мы соответствующим образом скорректировали модель и теперь показываем результаты рядом с результатами L1:

Разница между результатами модели потерь L1 и модели потерь L2 оказалась не такой резкой, как мы надеялись. На самом деле, результаты настолько похожи, что какая модель раскрашена лучше, субъективно и остается открытым для читателя. Потери для модели L2 с течением времени показаны ниже:

Интересно, что с моделью потерь L2 мы видим, что потери GAN резко увеличиваются с крутым наклоном для первых 40 000 итераций, а затем стабилизируются с наклоном, более похожим на наклон модели L1. Мы прервали модель на раннем этапе и обнаружили, что модель давала такие же результаты при 40 000 итерациях, как и к концу времени обучения.

Однако модель потерь L2 по-прежнему не давала хороших результатов на наборе обобщения по сравнению с тестовым набором CartoonSet. Модель потерь L2 работала хуже на проверочном наборе мультфильмов, но примерно так же работала на наборе обобщения, что заставило нас понять, что нам нужно настроить больше, чем просто функцию потерь. Итак, мы предположили, что можем уменьшить переоснащение модели, «упростив» сложность модели. А именно, урезаем вдвое количество слоев модели.

Мы протестировали эту «сжатую» модель на множестве обобщений:

Сжатая модель показала гораздо худшие результаты на множестве обобщения. Модель не смогла точно определить края и сохранить окраску внутри них. Это навело нас на мысль, что мы, возможно, слишком сильно уменьшили сложность. Для изучения этой идеи Squeezed GAN необходимы дальнейшие эксперименты с количеством слоев, которые нужно сохранить, и настройка гиперпараметров.

Инструменты

Для этого проекта у нашей команды возникла проблема выбора между созданием модели в Pytorch и созданием модели в Tensorflow. При настройке и экспериментировании с оригинальной моделью pix2pix, разработанной BAIR в Pytorch, наша команда столкнулась с множеством проблем и решила перейти на Tensorflow, поскольку мы ожидали, что сможем получить помощь от гораздо более крупного сообщества поддержки Tensorflow. Сначала дизайн модели Tensorflow был более запутанным, но мы смогли заставить его работать, провести рефакторинг и расширить его. Чтобы продемонстрировать достаточное понимание модели для этого класса, наша команда провела рефакторинг и тщательно прокомментировала исходный код и предоставила его в нашем репозитории Github. [5] Мы также предоставляем код для обеих модифицированных моделей (L2 loss и Squeezed).

Кроме того, Tensorflow API поставляется со многими инструментами, включая TensorBoard, которые мы смогли использовать для более глубокого понимания статического графа нашей модели. Наконец, нам понадобился графический процессор для запуска модели, и мы запросили у Amazon инстанс p2.xlarge, на обработку и утверждение наших учетных записей ушли недели. Вместо этого мы запускали наш код на вычислительном узле GPU, к которому имел доступ один из членов нашей команды.

Уроки выучены

Мы узнали, что загрузка и настройка модели из другой исследовательской работы может стать настоящей головной болью. Поскольку авторы больше не обновляют репозиторий, код может быть усеян ошибками, многие из которых уже были обнаружены на странице Github Issues, но требуют тщательного отслеживания. Для статьи pix2pix [1] модель изначально была закодирована на Lua, а затем перенесена в PyTorch и Tensorflow. Как уже говорилось, сначала мы пытались настроить вариант PyTorch, но столкнулись с таким количеством проблем, что вместо этого перешли на версию Tensorflow.

Напомним, что модель pix2pix, представленная в [1], отлично показала себя на типе набора данных, который не обсуждался в оригинальной статье: мультфильмах. Имея всего 100 обучающих образцов, модель смогла раскрасить эскизы мультфильмов, и результаты выглядели близко к оригиналу. С 1000 тренировочными наборами модель показала себя на удивление хорошо.

Мы понимаем, что нейронные сети, как правило, плохо работают на тестовых выборках, которые не поступают из того же «распределения», что и обучающая выборка, но мы хотели посмотреть, можем ли мы повысить обобщаемость нашей модели, настроив ее, чтобы сделать ее менее склонны к переобучению.

Мы попробовали это, отметив, что регуляризаторы L2 вызывают размытие изображений. Мы предположили, что это может на самом деле помочь обобщению, но разница в результатах на наборе обобщения незначительна по сравнению с исходным L1. Нас удивило, что модель L2 дала худшие результаты на проверочных выборках CartoonSet, но почти идентичные результаты на обобщающем наборе.

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

Это привело нас к выводу, что попытка повысить обобщаемость нейронной сети — очень сложная задача. Без глубокого теоретического понимания каждого компонента структуры нейронной сети трудно рассуждать о том, какие модификации нужно внести. Лучшее, что мы могли сделать, — это выдвинуть гипотезы высокого уровня и проверить их. Тем не менее, «проверка» гипотезы включает в себя обучение сети с нуля, что занимает порядка 24 часов.

Код

Весь код доступен в нашем общедоступном репозитории GitHub [5].

Взносы

Манар Сафи — 50%

Манар участвовал в разработке слайдов и разработал весь плакат. Он написал для отчета результаты, анализ и извлеченные уроки.

Он взял код pix2pix и переработал новую, «сжатую» версию модели, в которой использовалось меньше слоев и сложности. Он также разработал другую версию модели, в которой использовалась другая функция потерь L2. Он также помогал рефакторить/комментировать исходный код pix2pix.

Он также предоставил команде вычислительный узел GPU, который мы использовали для запуска кода, и помог настроить исходную модель pix2pix как в PyTorch, так и в Tensorflow.

Он провел эксперимент с 1000 образцами с исходной моделью, а также провел эксперименты для моделей L2 и Squeezed. Затем он собрал результаты обучения и графики результатов из Tensorboard.

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

Никита Гириш — 25%

Никита помог в создании слайдов презентации и помог с постерной сессией. Она написала раздел отчета «Подход» и внесла свой вклад в разделы «Результаты/Анализ» и «Общие сведения». Она проанализировала структуру исходной модели pix2pix (в частности, генератора) и произвела рефакторинг/комментарии генератора/дискриминатора.

Хершал Бхатия — 25%

Хершал помог с первоначальным обучением и тестированием pix2pix. Начата первоначальная работа над моделью Tensorflow pix2pix, а также отладка предыдущей модели PyTorch. Помогал комментировать и рефакторить исходный код pix2pix.

использованная литература

[1]. https://arxiv.org/pdf/1611.07004.pdf Изола, Чжу и Чжоу. Преобразование изображения в изображение с условными состязательными сетями

[2]. https://arxiv.org/pdf/1511.06434.pdf А. Рэдфорд, Л. Мец и С. Чинтала. Неконтролируемое репрезентативное обучение с помощью глубоких сверточных генеративно-состязательных сетей.

[3]. https://github.com/affinelayer/pix2pix-tensorflow

[4]. https://google.github.io/cartoonset/index.html

[5]. https://github.com/safi-manar/CartoonColorization_194Project