Аннотация: В этой статье подробно представлены базовые знания о генеративно-состязательной сети GAN, в том числе о том, что такое GAN, часто используемые алгоритмы (CGAN, DCGAN, infoGAN, WGAN), история разработки, подготовительные знания и построение простейшей рукописной цифровой картинки через Keras. Создать дело.
Эта статья опубликована в сообществе HUAWEI CLOUD.«[Чтение статьи] (06) Подробное объяснение из 10 000 слов Что такое генеративно-состязательная сеть GAN? Популяризация классических бумаг и футляров»., Автор: истмаунт.
1. Введение в ГАН
1. Базовые знания ГАН
Ян Гудфеллоу известен тем, что предложил генеративно-состязательные сети (GAN, генеративно-состязательные сети).GAN впервые был предложен Яном Гудфеллоу в 2014 г. Благодаря своей превосходной производительности он быстро стал центром исследований менее чем за два года. Он также известен как «отец GAN» и даже получил звание главного эксперта в области искусственного интеллекта.
Оригинальный текст ГАН:АР Вест V.org/ABS/1406.26…
Результаты эксперимента показаны на рисунке ниже, и созданы соответствующие изображения.
Возможно, вам еще немного незнакомо это имя, но если вы имеете представление о глубоком обучении, вы его узнаете. Автором бестселлера «Глубокое обучение» является Ян Гудфеллоу.
В 2016 году Ян Гудфеллоу подробно представил GAN в статье объемом более 50 страниц, которую также рекомендуется изучить всем.
Янн ЛеКун назвал GAN «самой интересной идеей в мире машинного обучения за последнее десятилетие». Популярность GAN на github показана на рисунке ниже, который растет в геометрической прогрессии и показывает различные деформации. Конечно, есть и много статей относительно водянистых, рекомендуется попробовать изучить более классические модели.
2. Анализ принципа GAN
Прежде всего, что такое ГАН?
GAN (генеративно-состязательные сети, состязательные генеративные сети) могут разделять и понимать эти три слова.
Генеративный: генеративные модели
Состязательность: примите состязательную стратегию
Сети: Сети (не обязательно глубокое обучение)
Как резюмировал босс шунлиза:
GAN — это класс генеративных моделей, и нетрудно догадаться, что в нем участвуют два «противника», один из которых называется Генератор, а другой — Дискриминатор. Оригинальная обучающая статья Гудфеллоу по GAN на arxiv сравнила их с генератором и дискриминатором. Фальшивомонетчики всегда хотят создавать банкноты, которые можно подделать, а полиция старается использовать более продвинутые технологии, чтобы отличить настоящие от подделки. Эти двое постоянно улучшают свои технологии во время игры.
С точки зрения теории игр, если это игра с нулевой суммой, они в конечном итоге достигнут равновесия Нэша, то есть существует набор стратегий (g, d).Если Генератор не выбирает стратегию g, Тогда для Дискриминатора всегда найдется стратегия, из-за которой Генератор проиграет еще больше; точно так же справедливо заменить Генератор Дискриминатором.
Если функция потерь, определяемая GAN, удовлетворяет игре с нулевой суммой и имеется достаточно выборок, обе стороны имеют достаточную способность к обучению.В этом случае оптимальной стратегией Генератора и Дискриминатора является точка равновесия Нэша, то есть: Генератор генерирует все банкноты являются «настоящими банкнотами» (материалы и технология такие же, как и настоящие банкноты, но они не авторизованы), и Дискриминатор определит любые банкноты как настоящие банкноты с вероятностью 1/2.
Итак, что именно могут делать GAN?
Как показано на рисунке ниже, это очень интересная картинка. Крайняя левая картинка — реальная картинка. Мы хотим предсказать появление следующих нескольких кадров видео. Средняя картинка сделана с MSE, а самая правая картинка — генеративно-состязательная сеть. Благодаря подробному анализу мы видим, что уши и глаза на среднем изображении размыты, а эффект, создаваемый GAN, значительно лучше.
Далее мы рассмотрим пример сверхвысокого разрешения. Сначала дается изображение со сверхвысоким разрешением, крайнее левое изображение является исходным изображением с высоким разрешением (оригиналом), а затем оно подвергается понижению разрешения для получения изображения с низким разрешением, а затем используются различные методы для обработки изображения с низким разрешением. Восстановление, конкретная работа выглядит следующим образом:
бикубический: второе изображение — это изображение, восстановленное бикубическим методом. После сжатия и растяжения восстановленного изображения осуществляется интерполяция, но изображение становится размытым.
SRResNet: третье изображение восстанавливается SRResNet, например, сжатие изображения, а затем использование MSE и нейронной сети, чтобы узнать разницу между реальным значением и восстановлением. (SRResNet — нейронная сеть, обученная на основе среднеквадратичной ошибки)
SRGAN: Четвертое изображение получено с помощью SRGAN, и его эффект восстановления лучше. SRGAN — это усовершенствование GAN, которое понимает, что есть несколько правильных ответов, а не дает один лучший результат среди многих ответов.
Мы обращаем внимание на детали резьбы головы на изображении и обнаруживаем, что контуры, восстановленные GAN, более четкие. Этот эксперимент показывает преимущество использования обученной генеративной модели для создания реальных выборок из мультимодального распределения.
Здесь мы также популяризируем супер-разрешение — SRCNN. Впервые это было предложено в статье «Изучение глубокой сверточной сети для сверхразрешения изображения». Четыре автора этой статьи — Донг Чао, Чен Чанг Лой, Хэ Каймин и Тан Сяоу. Они также являются настоящими богами. С точки зрения резюме, эта статья действительно впечатляет.
Теперь предположим, что мы хотим решить проблему: можем ли мы решить сверхвысокое разрешение и восстановить изображение с низкого разрешения на изображение с высоким разрешением, как это сделать? Они решили практическую проблему, добавив сеть из двух сверточных слоев, и эта статья опубликовала топ-встречу.
lincoln.springer.com/chapter/10. …
Для более подробного ознакомления, пожалуйста, обратитесь к публикации Zhihu oneTaken.
Это первая статья, в которой используется сквозное обучение глубокому обучению для супероценки.Сейчас процесс всей статьи кажется относительно простым.Во-первых, изображение с низким разрешением преобразуется с помощью бикубической интерполяции в изображение с высоким разрешением. Затем два слоя свертки используются для отображения признаков, и, наконец, MSE используется в качестве функции потерь при реконструкции для обучения. С этого момента многие вещи по-прежнему остаются относительно грубыми, но эта статья также стала основой для многих статей с суперскорингом.
Нововведениями всей статьи являются:
(1) Сверточная нейронная сеть используется для суперразрешения, чтобы изучить сопоставление между низким разрешением и суперразрешением от начала до конца.
(2) Установить связь между предлагаемой моделью нейронной сети и традиционными методами разреженного кодирования, и эта связь также определяет дизайн моделей нейронной сети.
(3) Экспериментальные результаты показывают, что метод глубокого обучения можно использовать для супероценки, а также получить более высокое качество и более высокую скорость.
Вся архитектура модели очень проста.Во-первых, входное изображение подвергается бикубической интерполяции дискретизации в пространство с высоким разрешением, затем слой свертки используется для извлечения признаков, ReLU используется для нелинейного отображения, и, наконец, свертка используется для реконструкция с использованием MSE используется как потеря реконструкции. Интерлюдия в середине — это расширение традиционного алгоритма разреженного кодирования для супероценки, которое можно рассматривать как модель сверточной нейронной сети с различными нелинейными отображениями.
3. Классический кейс GAN
Что именно может сделать GNN?
Давайте взглянем на некоторые из наиболее интересных случаев GAN.
Первое — это видео, в котором Чжу и др. разработали интерактивную генеративно-состязательную сеть (iGAN), где пользователь может нарисовать грубый набросок изображения и использовать GAN для создания похожих изображений реального мира. В этом примере пользователь начертил несколько зеленых линий, чтобы превратить его в кусок травы, и взял еще один черный треугольник, чтобы создать холм.
Другим классическим случаем является то, что короткий ввод кожаной сумки слева, наконец, создает изображение, близкое к реальной сумке, или преобразует спутниковые фотографии в карты и преобразует изображения порогового транспортного средства в реалистичные изображения.
Другим примером является использование GAN для прогнозирования того, что произойдет со следующим кадром анимации в видео, например, если в правом нижнем углу дано статичное изображение поезда, будет сгенерировано динамическое видео движения поезда.
Ву и др. использовали GAN для создания 3D-модели стула с шумом в NIPS 2016.
На картинке ниже — starGAN. Вход слева — это лицо, а затем GAN сгенерирует соответствующие выражения радости, гнева, печали и радости.Новаторство этой статьи не в том, чтобы сказать, что GAN может это сделать, а в том, чтобы предложить решение.Все ядро функции вместе, только обучение генератора, то есть вместо создания генераторов «многие ко многим» обучается только один генератор для достижения этих функций.
starGAN передает знания, полученные из набора данных RaFD, результаты многодоменного перевода изображений в набор данных CelebA. В первом и шестом столбцах показаны входные изображения, а в остальных столбцах — изображения, сгенерированные starGAN. Обратите внимание, что эти изображения генерируются одной сетью генераторов, в то время как метки выражений лица, такие как гнев, счастье и страх, получены от RaFD, а не от CelebA.
Талант.AR West V.org/PDF/1711.09…
2. Предварительные сведения о GAN
Зачем говорить о подготовительных знаниях?
Изучая основы нейронных сетей, мы можем еще больше углубить наше понимание GAN. Конечно, многие читатели, которые читают эту статью, возможно, уже имеют представление о глубоком обучении или находятся на уровне босса, здесь мы также позаботимся о новичках и популяризируем базовые знания о GAN. Новичкам рекомендуется прочитать цикл статей автора, который знакомит со многими основными принципами.
1. Что такое нейронная сеть
Прежде всего, глубокое обучение заключается в моделировании нерва головного мозга человека (биологической нейронной сети).Например, нейрон в верхней левой части рисунка ниже можно рассматривать как приемный конец нейронной сети.У него много дендритов для получать сигналы Формула, соответствующая Нейрону, выглядит следующим образом:
где a представляет сигнал (полученный дендритами), а w представляет соответствующие веса, которые объединяются взвешенным суммированием и включают смещение b. Функция активации используется для определения того, может ли он передать сигнал следующему нейрону.
С этим нейроном нам нужно построить сеть, как показано в правом нижнем углу ②. После одного слоя, двух слоев и трех слоев нейронных сетей у нас, наконец, будет суждение, как показано в правом верхнем углу ③, после решения функции Softmax мы решим, что это за изображение, например кошка или собака.
Во-вторых, каковы точки знаний глубокого обучения?
Сетевой дизайн глубокого обучения показан на следующем рисунке:
- Общие слои нейронной сети
Полносвязный слой, уровень активации, слой BN, слой исключения, слой свертки, слой пула, рекуррентный слой, слой встраивания, слой Merege и т. д.
- конфигурация сети
Функции потерь, оптимизаторы, функции активации, оценка производительности, методы инициализации, условия регуляризации и т. д.
- Процесс обучения сети
Модель перед обучением, процесс обучения, предварительная обработка данных (нормализация, встраивание), улучшение данных (воздействие поворота изображения для создания массивных выборок) и т. д.
Дополнение: Интерпретируемость глубокого обучения очень плохая, и часто неизвестно, почему это правильно. Важность интерпретируемости часто обсуждается на конференциях НЛП. Лично я считаю, что если использовать традиционный метод, то эффект может достигать 80%, а если глубокое обучение значительно улучшить, например, на 10%, лично я чувствую, что индустрия все равно будет его использовать, потому что он может повысить производительность и решать задачи. Если, например, в задачах контроля рисков Meituan не обнаружит аномальное считывание заказа, и в это время ему необходимо точно подтвердить, был ли считывание заказа.
2. Полностью связанный слой
Вход и выход скрытого слоя связаны, то есть каждый узел полносвязного слоя соединен со всеми узлами предыдущего слоя, который используется для синтеза извлеченных ранее признаков. Из-за его полносвязных характеристик параметры полносвязного слоя, как правило, самые высокие.
Полносвязный слой включает в себя формулу расчета нейронов, размерность (количество нейронов), функцию активации, метод инициализации весов (w, b) и регулярный член.
3. Функция активации
Функция активации заставляет сначала активироваться определенную часть нейронов, а затем передает информацию об активации в нейронную систему следующего слоя. Например, какой-то нейрон увидит изображение кота, его особенно заинтересуют кошачьи глаза, затем, когда нейрон увидит кошачьи глаза, он возбудится, и его значение возрастет.
Функция активации эквивалентна фильтру или возбудителю, который активирует уникальную информацию или функции.Обычные функции активации включают softplus, sigmoid, relu, softmax, elu, tanh и т. д.
Для скрытого слоя мы можем использовать нелинейные отношения, такие как relu, tanh, softplus;
Для задач классификации мы можем использовать сигмоид (чем меньше значение, тем ближе к 0, чем больше значение, тем ближе к 1), функцию softmax, вероятность каждого класса и, наконец, максимальную вероятность как результат;
Для задач регрессии вы можете поэкспериментировать с линейными функциями.
Функция активации может ссылаться на предыдущую третью статью автора.
Обычно используемые функции активации Кривые Sigmoid, tanh, ReLU и Leaky ReLU показаны на следующем рисунке:
4. Обратное распространение
Нейронная сеть BP — очень классическая сеть, здесь обратное распространение нейронной сети объясняется двумя картинками EdisonGzq. Для нейрона это вычисление влияния конечной передачи ошибки на каждый вес, то есть вычисление градиента изменения обратной передачи каждого слоя.
Для нескольких нейронов это выход двух линий, которые проходят в обратном направлении, Eo1 и Eo2, как показано на рисунке ниже.
5. Выбор оптимизатора
После изменения градиента будет итеративная схема, и у этой схемы будет много вариантов. Существует много видов оптимизаторов, но их можно условно разделить на две категории:
-
Оптимизатор следует за градиентом и каждый раз наблюдает только свой собственный градиент, он не имеет веса
-
Оптимизатор взвешен
class tf.train.Optimizer — это базовый класс для класса оптимизаторов. Существует много разных видов оптимизаторов, самый простой из них — GradientDescentOptimizer, который также является наиболее важной или базовой линейной оптимизацией в машинном обучении. Семь распространенных оптимизаторов включают в себя:
-
class tf.train.GradientDescentOptimizer
-
class tf.train.AdagradOptimizer
-
class tf.train.AdadeltaOptimizer
-
class tf.train.MomentumOptimizer
-
class tf.train.AdamOptimizer
-
class tf.train.FtrlOptimizer
-
class tf.train.RMSPropOptimizer
Ниже приводится краткое введение в четыре наиболее часто используемых оптимизатора: (Сводка рекомендуемых оптимизаторов)
- GradientDescentOptimizer
Gradient Descent GD зависит от размера входящих данных. Например, передается только одна десятая от общего объема данных. Gradient Descent Optimizer становится SGD. Он учитывает только часть данных и часть обучения. Преимущество в том, что может быть быстрее узнать путь к глобальному минимуму.
- MomentumOptimizer
Он основан на изменении эффективности обучения.Он не только учитывает эффективность обучения на этом шаге, но также загружает тренд эффективности обучения на предыдущем шаге, а затем добавляет скорость обучения этого шага на предыдущем шаге.Он достигнет глобальный минимум быстрее, чем GradientDescentOptimizer.
- AdamOptimizer
Имя Адама происходит от адаптивной оценки момента, которая также является вариантом алгоритма градиентного спуска, но скорость обучения каждого параметра итерации имеет определенный диапазон, и скорость обучения (размер шага) не будет вызвана большим градиентом. также становится очень большим, а значение параметра относительно стабильным. Алгоритм Адама динамически регулирует скорость обучения каждого параметра, используя первую и вторую моментные оценки градиента.
- RMSPropOptimizer
Google использует его для оптимизации эффективности обучения AlphaGo. Алгоритм RMSProp изменяет накопление градиента AdaGrad на экспоненциально взвешенное скользящее среднее, что делает его лучше в невыпуклых настройках.
Различные оптимизаторы используют разные алгоритмы оптимизации (такие как Mmentum, SGD, Adam и т. д.), которые по сути являются расширениями алгоритма градиентного спуска. На следующем рисунке сравниваются и анализируются различные оптимизаторы с помощью визуализации. Процесс машинного обучения от целевого обучения до оптимального имеет разные пути обучения. Поскольку Momentum учитывает скорость обучения предыдущего шага, путь будет очень длинным; время обучения GradientDescent будет очень медленным. . предложения ниже:
Если вы новичок, рекомендуется использовать GradientDescentOptimizer.Если у вас есть определенная основа, вы можете рассмотреть два часто используемых оптимизатора, MomentumOptimizer и AdamOptimizer.Для продвинутых вы можете попробовать изучить оптимизатор RMSPropOptimizer. В заключение, вам лучше выбрать подходящий оптимизатор в сочетании с вашим конкретным исследовательским вопросом.
6. Сверточный слой
Почему предлагаются сверточные слои? Потому что у полносвязного слоя есть основная болевая точка:
Слишком много параметров изображения, например, изображение 1000 * 1000, добавить скрытый слой, узел скрытого слоя совпадает с входным размером, а параметр полной связи равен 10 ^ 12, поэтому невозможно обучить столько параметры.
Оружие 1: Локальное поле восприятия
Предлагается концепция ядра свертки для локального восприятия информации.
Оружие 2: совместное использование параметров
Сканируя 3x3 из левого верхнего угла изображения в правый нижний угол, получается результат, показанный справа, а количество параметров уменьшается за счет совместного использования свертки. Обратите внимание, что ядро свертки здесь выглядит следующим образом:
\left[ \begin{matrix} 1 & 0 & 1 \ 0 & 1 & 0 \ 1 & 0 & 1 \end{matrix} \right]⎣⎡101010101⎦⎤
Текущая сканируемая область выглядит следующим образом, а окончательный результат вычисления равен 2.
\left[ \begin{matrix} 0 & 1 & 1 \ 0 & 0 & 1 \ 0 & 0 & 1 \end{matrix} \right]⎣⎡000100111⎦⎤
Основные точки знаний о сверточном слое следующие:
-
Количество ядер свертки
-
Размер ядра свертки: как указано выше, ядро свертки 3x3.
-
Количество ядер свертки
-
Размер шага ядра свертки: указанный выше размер шага равен 1, который также можно настроить.
-
функция активации
-
Заполнение: например, приведенное выше изображение должно выводить результирующее изображение 5x5, и нам нужно заполнить внешний круг нулями.
-
использовать ли предвзятость
-
скорость обучения
-
инициализация
На рисунке ниже показаны пять сверточных слоев и выходные данные каждого слоя. Он учится от изначально простых графов к последующим сложным графам.
7. Слой объединения
Основные проблемы, решаемые уровнем объединения:
- Уменьшите карту признаков и упростите сеть; сжатие признаков, извлечение основных признаков
Общие слои объединения включают в себя:
-
Максимальное объединение: например, выберите самые большие 6 из красной области в верхнем левом углу, а затем 8, 3 и 4.
-
Средний пул: выберите средний
Базовые очки знаний показаны на следующем рисунке:
8. Основные идеи задач изображения
На этом этапе мы можем решать практические проблемы, вводя полносвязные слои, сверточные слои и объединяющие слои. Как показано ниже:
- входной слой
Например, предложения НЛП, пары предложений, пиксельная матрица изображений, звуковая информация речи.
- уровень представления
DNN: полносвязный + нелинейный (функция нелинейного слияния)
CNN: Conv1d, Conv2d, объединение
RNN: LSTM, GRU (память выбора)
- прикладной уровень
Классификация, регрессия, предсказание последовательности, сопоставление
Основная идея задачи изображения может быть упрощена до модели, показанной на рисунке ниже.
Пока вводятся подготовительные знания! Далее мы входим в реальный боевой анализ сети GAN.
3. Реальный боевой анализ сети GAN
GAN (генеративные состязательные сети) состязательные генеративные сети
-
Генеративный: генеративные модели
-
Состязательность: примите состязательную стратегию
-
Сети: Сети
1. Анализ модели ГАН
Прежде всего, давайте поговорим о том, что делает GAN?
-
Сначала на рисунке (а) мы генерируем зеленую линию, которая представляет собой распределение вероятностей сгенерированных выборок, черный разброс представляет собой распределение вероятностей реальных выборок, и эта синяя линия является решающим фактором, чтобы судить, когда она должна быть правда или ложь. .
-
Первое, что нам нужно сделать, это точно оценить судью, как показано синей линией на рисунке (b), предполагая, что он попадает в положение 0,5, первый считается реальным образцом, а второй считается поддельным образцом.
-
Когда он зафиксирован, на рисунке © генератор пытается подобрать реальные данные и пытается ввести в заблуждение принимающего решения.
-
Окончательное выходное изображение (d), если ваши реальные образцы точно такие же, как сгенерированные образцы, и распределения точно такие же, судья глуп и не может продолжать судить.
Может быть, все еще запутались, давайте подробно представим идею ниже.
-
Генераторы: Изучите настоящие образцы, чтобы они выглядели настоящими
-
Дискриминатор: уровень детского детектора денег через обучение
Общая идея GAN - это генератор и дискриминатор, и статья GoodFellow доказывает, что необходимые и достаточные условия для точки глобального минимума GAN - это когда распределение вероятностей генератора и распределение вероятностей реального значения согласуются .
Глобальная оптимальность p_g=p_{data}GlobalOptimalityofpg=pdata
Во-вторых, какие проблемы нужно анализировать GAN?
-
Как задается целевая функция?
-
Как генерировать картинки?
-
Как должны быть настроены G-генератор и D-решатель?
-
Как тренироваться?
(1) Целевая функция
Целевая функция имеет следующий вид, где:
-
Формула max() является первым шагом, что означает, что генератор G фиксирован, так что дискриминатор может максимально различать настоящие образцы и поддельные образцы, то есть есть надежда, что, когда генератор не движется, дискриминатор может различать реальные образцы и сгенерированные образцы.
-
Формула min() — это второй шаг, вся формула. Фиксирован дискриминатор D. Настраивая генератор, надеются, что дискриминатор будет ошибаться и стараться не делать его различимым.
Это тоже игровой процесс.
Конкретный смысл всей формулы заключается в следующем:
-
Формула состоит из двух членов: x представляет собой реальное изображение, z представляет шум, вводимый в сеть G, а G(z) представляет изображение, созданное сетью G.
-
D(x) представляет собой вероятность того, что сеть D определит, является ли реальное изображение реальным (поскольку x является реальным, поэтому для D чем ближе это значение к 1, тем лучше).
-
D(G(z)) — это вероятность того, что сеть D определит, является ли изображение, сгенерированное G, реальным. Цель G: G должен надеяться, что изображения, которые он генерирует, максимально приближены к реальным.
-
Назначение D: Чем сильнее способность D, тем больше должно быть D(x) и меньше должно быть D(G(x)) В это время V(D, G) станет больше, поэтому формула для D состоит в том, чтобы найти max(max_D).
-
Уловка: чтобы ускорить обучение на ранней стадии, обучение генератора может заменить функцию потерь log(1-D(G(z))) на -log(D(G(z))).
Тогда давайте вернемся к исходной статье о Великом Боге и посмотрим на его алгоритм (Алгоритм 1) процесса.
-
Самый внешний слой — это цикл for, за которым следует цикл for k раз, а средняя итерация — решающая.
-
После завершения k циклов for генератор повторяется снова.
-
Наконец, закончите петлю.
(2) Генерация изображений GAN
Затем мы вводим схему обучения для создания изображений через GAN.
-
Шаг 1 (левое изображение): я хочу, чтобы принимающее решение отделяло реальные данные от данных, которые я генерирую, насколько это возможно. Итак, как этого достичь? Мои реальные данные — input1 (изображения реального мира), а мои сгенерированные данные — input2 (генератор). Нормальный вывод input1 равен 1, а нормальный вывод input2 равен 0. Для дискриминатора (дискриминатора) я хочу, чтобы он хорошо решался.Сначала зафиксируйте генератор (пунктирная линия T), а затем сгенерируйте партию выборок и смешать реальные данные Пусть решает судья. В это время обученный решатель становится сильнее, то есть генератор закрепляется, а решатель обучается.
-
Шаг 2 (правое изображение): Зафиксируйте судью (пунктирная линия T), я хочу его запутать, судья, который только что был обучен, очень мощный, в это время мы пытаемся настроить генератор, чтобы запутать дискриминатор, то есть путем фиксации решающего устройства и настройки генератора таким образом, чтобы конечный выходной вывод также выдавал 1 для сгенерированных данных (первый шаг равен 0).
Ядро GAN состоит в следующем, а затем кратко изложено, а именно:
-
Шаг 1 — когда генератор исправлен, я позволяю ему генерировать партию сэмплов, а затем позволяю решающему устройству правильно различать настоящие сэмплы и сгенерированные сэмплы. (метка генератора 0, метка наземной истины 1)
-
Шаг 2 заключается в исправлении решающего устройства путем настройки генератора, чтобы максимально запутать решающее устройство, поэтому фактически в это время генератор обучается. (Метка генератора должна быть распознана решающим устройством как 1, то есть реальная выборка)
Его псевдокод выглядит следующим образом:
for 迭代 in range(迭代总数):
for batch in range(batch_size):
新batch = input1的batch + input2的batch (batch加倍)
for 轮数 in range(判别器中轮数):
步骤一 训练D
步骤二 训练G
2. Создайте рукописный цифровой демонстрационный анализ
Далее мы усиливаем впечатление читателя, генерируя код из рукописных цифровых изображений. Это относительно классический общий набор данных, включающий множество случаев классификации изображений.Здесь мы в основном генерируем рукописные цифровые изображения.
Во-первых, давайте посмотрим, как генератор формирует изображение (из шума)? Основной код выглядит следующим образом: сначала случайным образом генерируется шум, а все сгенерированные картинки реализуются шумом. Справочный код Кераса:
(1) Генератор
Всего в генератор G входят:
-
Полностью связанный слой: ввод 100 измерений, вывод 1024 измерений
-
Полносвязный слой: 128x7x7 означает 128 каналов картинки, размер 7x7
-
BatchNormalization: если вы не добавите его, программа DCGAN выйдет из строя.
-
UpSampling2D: повышающая дискретизация результата свертки для увеличения карты признаков на 14x14.
-
Conv2D: инвариант масштаба пикселя операции свертки (то же самое)
-
UpSampling2D: создание 28x28Conv2D: операция свертки
-
Активация: функция активации tanh
(2) Дискриминатор D
Дискриминатор должен решить задачу бинарной классификации, либо истинную, либо ложную.
-
Conv2D: сверточный слой
-
MaxPooling2D: слой объединения
-
Conv2D: сверточный слой
-
MaxPooling2D: слой объединения
-
Сведение: сведение одного измерения
-
Плотный: полносвязный слой
-
Активация: сигмовидная бинарная классификация
(3) Вспомогательная функция
Как исправить D, чтобы скорректировать функцию генератора_содержащего_дискриминатора G.
-
model.add(g): генератор нагрузки G
-
d.trainable=False: решающий фактор D зафиксирован
Функция comb_images реализует операцию объединения изображений.
(4) Обучение созданию изображений GAN
Основной процесс GAN включает в себя:
-
load_data: загрузить изображение
-
d = модель_дискриминатора: определяет дискриминатор D
-
g = генератор_модель: определяет генератор G
-
генератор_содержащий_дискриминатор: фиксированный D регулирует G
-
SGD, компиляция: определение параметров, скорость обучения
-
для эпохи в диапазоне, для индекса в диапазонеBATCH
-
X = np.concatenate: сочетание данных изображения и сгенерированных данных
-
y = [1] x BATCH_SIZE + [0] x BTCH_SIZE: выходная метка
-
d_loss = d.train_on_batch(X,y): обучение дискриминатора D (шаг 1)
-
d.trainable = False: фиксированный D
-
g_loss = d_on_g.train_on_batch(шум, [1]xBATCH_SIZE): генератор поезда G (шаг 2), запутать
-
d.trainable=True: включить повторяющиеся операции D
-
Сохранить параметры и модели
(5) Создать
После обучения модели мы находим способ генерировать изображения с помощью GAN.
-
g = генератор_модель: определяет модель генератора
-
g.load_weights: загрузить обученный генератор (генератор)
-
шум: генерировать случайный шум
-
Затем используйте G для создания изображения, которое обманывает дискриминатор D.
Полный код выглядит следующим образом:
Этот код больше похож на простую GAN для генерации изображений.
# -*- coding: utf-8 -*-
"""
Created on 2021-03-19
@author: xiuzhang Eastmount CSDN
参考:https://github.com/jacobgil/keras-dcgan
"""
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Reshape
from keras.layers.core import Activation
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import UpSampling2D
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Flatten
from keras.optimizers import SGD
from keras.datasets import mnist
import tensorflow as tf
import numpy as np
from PIL import Image
import argparse
import math
import os
## GPU处理 读者如果是CPU注释该部分代码即可
## 指定每个GPU进程中使用显存的上限 0.9表示可以使用GPU 90%的资源进行训练
os.environ["CUDA_DEVICES_ORDER"] = "PCI_BUS_IS"
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
#----------------------------------------------------------------
#生成器
def generator_model():
model = Sequential()
model.add(Dense(input_dim=100, output_dim=1024))
model.add(Activation('tanh'))
model.add(Dense(128*7*7)) #7x7 128通道
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Reshape((7, 7, 128), input_shape=(128*7*7,)))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(64, (5, 5), padding='same'))
model.add(Activation('tanh'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(1, (5, 5), padding='same'))
model.add(Activation('tanh'))
return model
#----------------------------------------------------------------
#判别器
def discriminator_model():
model = Sequential()
model.add(
Conv2D(64, (5, 5),
padding='same',
input_shape=(28, 28, 1))
)
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (5, 5)))
model.add(Activation('tanh'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
return model
#----------------------------------------------------------------
#辅助函数 固定D调整G
def generator_containing_discriminator(g, d):
model = Sequential()
model.add(g)
d.trainable = False
model.add(d)
return model
#辅助函数 合并图像
def combine_images(generated_images):
num = generated_images.shape[0]
width = int(math.sqrt(num))
height = int(math.ceil(float(num)/width))
shape = generated_images.shape[1:3]
image = np.zeros((height*shape[0], width*shape[1]),
dtype=generated_images.dtype)
for index, img in enumerate(generated_images):
i = int(index/width)
j = index % width
image[i*shape[0]:(i+1)*shape[0], j*shape[1]:(j+1)*shape[1]] = \
img[:, :, 0]
return image
#----------------------------------------------------------------
#训练
def train(BATCH_SIZE):
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = (X_train.astype(np.float32) - 127.5)/127.5
X_train = X_train[:, :, :, None]
X_test = X_test[:, :, :, None]
#X_train = X_train.reshape((X_train.shape, 1) + X_train.shape[1:])
d = discriminator_model()
g = generator_model()
d_on_g = generator_containing_discriminator(g, d)
d_optim = SGD(lr=0.0005, momentum=0.9, nesterov=True)
g_optim = SGD(lr=0.0005, momentum=0.9, nesterov=True)
g.compile(loss='binary_crossentropy', optimizer="SGD")
d_on_g.compile(loss='binary_crossentropy', optimizer=g_optim)
d.trainable = True
d.compile(loss='binary_crossentropy', optimizer=d_optim)
for epoch in range(100):
print("Epoch is", epoch)
print("Number of batches", int(X_train.shape[0]/BATCH_SIZE))
for index in range(int(X_train.shape[0]/BATCH_SIZE)):
noise = np.random.uniform(-1, 1, size=(BATCH_SIZE, 100))
image_batch = X_train[index*BATCH_SIZE:(index+1)*BATCH_SIZE]
generated_images = g.predict(noise, verbose=0)
if index % 20 == 0:
image = combine_images(generated_images)
image = image*127.5+127.5
Image.fromarray(image.astype(np.uint8)).save(
str(epoch)+"_"+str(index)+".png")
X = np.concatenate((image_batch, generated_images))
y = [1] * BATCH_SIZE + [0] * BATCH_SIZE
d_loss = d.train_on_batch(X, y)
print("batch %d d_loss : %f" % (index, d_loss))
noise = np.random.uniform(-1, 1, (BATCH_SIZE, 100))
d.trainable = False
g_loss = d_on_g.train_on_batch(noise, [1] * BATCH_SIZE)
d.trainable = True
print("batch %d g_loss : %f" % (index, g_loss))
if index % 10 == 9:
g.save_weights('generator', True)
d.save_weights('discriminator', True)
#----------------------------------------------------------------
#GAN图片生成
def generate(BATCH_SIZE, nice=False):
g = generator_model()
g.compile(loss='binary_crossentropy', optimizer="SGD")
g.load_weights('generator')
if nice:
d = discriminator_model()
d.compile(loss='binary_crossentropy', optimizer="SGD")
d.load_weights('discriminator')
noise = np.random.uniform(-1, 1, (BATCH_SIZE*20, 100))
generated_images = g.predict(noise, verbose=1)
d_pret = d.predict(generated_images, verbose=1)
index = np.arange(0, BATCH_SIZE*20)
index.resize((BATCH_SIZE*20, 1))
pre_with_index = list(np.append(d_pret, index, axis=1))
pre_with_index.sort(key=lambda x: x[0], reverse=True)
nice_images = np.zeros((BATCH_SIZE,) + generated_images.shape[1:3], dtype=np.float32)
nice_images = nice_images[:, :, :, None]
for i in range(BATCH_SIZE):
idx = int(pre_with_index[i][1])
nice_images[i, :, :, 0] = generated_images[idx, :, :, 0]
image = combine_images(nice_images)
else:
noise = np.random.uniform(-1, 1, (BATCH_SIZE, 100))
generated_images = g.predict(noise, verbose=1)
image = combine_images(generated_images)
image = image*127.5+127.5
Image.fromarray(image.astype(np.uint8)).save(
"generated_image.png")
#参数设置
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("--mode", type=str)
parser.add_argument("--batch_size", type=int, default=128)
parser.add_argument("--nice", dest="nice", action="store_true")
parser.set_defaults(nice=False)
args = parser.parse_args()
return args
if __name__ == "__main__":
"""
args = get_args()
if args.mode == "train":
train(BATCH_SIZE=args.batch_size)
elif args.mode == "generate":
generate(BATCH_SIZE=args.batch_size, nice=args.nice)
"""
mode = "train"
if mode == "train":
train(BATCH_SIZE=128)
elif mode == "generate":
generate(BATCH_SIZE=128)
Параметры выполнения кода:
Training:
python dcgan.py --mode train --batch_size <batch_size>
python dcgan.py --mode train --path ~/images --batch_size 128
Image generation:
python dcgan.py --mode generate --batch_size <batch_size>
python dcgan.py --mode generate --batch_size <batch_size> --nice : top 5% images according to discriminator
python dcgan.py --mode generate --batch_size 128
В процессе обучения, во-первых, набор данных изображений MNIST, написанный от руки, можно загрузить и сохранить в этом месте, или вы можете запустить код, чтобы загрузить его онлайн.
Epoch is 0
Number of batches 468
batch 0 d_loss : 0.648902
batch 0 g_loss : 0.672132
batch 1 d_loss : 0.649307
....
batch 466 g_loss : 1.305099
batch 467 d_loss : 0.375284
batch 467 g_loss : 1.298173
Epoch is 1
Number of batches 468
batch 0 d_loss : 0.461435
batch 0 g_loss : 1.231795
batch 1 d_loss : 0.412679
....
Во время операции будет создано много изображений, и изображения будут становиться все четче и четче по мере увеличения количества тренировок.
Затем для параметра устанавливается значение «генерировать», и для окончательного создания изображения используется GAN, как показано на следующем рисунке.
3. Другие распространенные сети GAN
(1) CGAN
Во-первых, как GAN выводит изображения определенного класса?
Появился ЦГАН. Вот краткое введение в разницу между GAN и CGAN: GAN может только судить, являются ли сгенерированные вещи истинными или ложными Что, если вы хотите указать сгенерированные изображения, такие как 1, 2 и 3? GAN сначала сгенерирует 100 изображений, а затем выберет из них 1, 2 и 3, что очень неудобно.
Когда в 2014 году была предложена GAN, также была предложена CGAN. В дополнение к генерации, CGAN также необходимо вывести условия, то есть запутать, какие условия графа мы хотим сгенерировать, как показано на правом рисунке ниже: вектор шума z + вектор условия c для генерации.
Таким образом, весь процесс в основном такой же, а затем мы смотрим на формулу, которая добавляет y к D(x|y) и G(z|y). Среди них y не обязательно является выходом указанного класса, но может быть некоторыми условиями.
(2) DCGAN
DCGAN (глубокие сверточные генеративные состязательные сети)
В классической статье, объединяющей сверточные нейронные сети и состязательные нейронные сети, основным элементом является предложение некоторых приемов, которые помогают повысить стабильность без изменения принципа GAN. Обратите внимание, это важно. Поскольку обучение GAN не так стабильно, как предполагалось, генератор часто выдает бессмысленные выходные данные или дает сбои в конце, но DCGAN может генерировать более качественные изображения в соответствии с уловками.
Уловки, использованные в документе DCGAN, включают:
-
Весь пул заменяется шаговыми свертками, даунсэмплинг объединения - это потеря информации, шаговые свертки могут позволить модели самостоятельно изучить потерю информации.
-
И генератор G, и дискриминатор D используют слои BN (для решения проблемы переобучения).
-
Удалите полностью связанный слой и замените его на полностью сверточный слой.
-
В дополнение к выходному слою генератора функция активации единообразно использует ReLU, а выходной слой использует Tanh
-
Функция активации всех слоев дискриминатора равномерно LeakyReLU
(3) ACGAN
ACGAN (генерация и классификация изображений)
Условный синтез изображения с помощью GAN вспомогательного классификатора, дискриминатор должен не только определить, является ли оно реальным или поддельным, но и определить, к какому классу оно принадлежит.
(4) infoGAN
InfoGAN: обучение интерпретируемому представлению с помощью информационных максимизирующих генеративно-состязательных сетей. Это известно как один из пяти прорывов OpenAI в 2016 году.
-
Вход сети D только x, без c
-
Сеть Q и сеть D используют одну и ту же сеть, но независимо выводят на последний уровень.
-
Выход G(z) сильно отличается от условия c
Оригинальный адрес:АР Вест V.org/ABS/1606.03…
Теория такова:
Обучение всей сети основано на исходной целевой функции и добавлена нижняя граница взаимной информации L(G,Q), поэтому целевая функция InfoGAN окончательно выражается как:
Результаты эксперимента показаны на следующем рисунке:
(5) LAPGAN
Давайте представим более интересную сеть лапласиана GAN. Наша цель - как сгенерировать картинку через шум.Сгенерировать картинку из самого шума сложно, да и неуправляемых величин слишком много, поэтому генерируем его слой за слоем (генерация выглядит справа налево).
-
Сначала используем шум, чтобы сгенерировать маленькое изображение с очень низким разрешением, растянем его.
-
После растяжения найдите способ сгенерировать его остаток через ранее обученную сеть GAN.
-
Остатки и растянутые графики складываются вместе для создания большего изображения, и так далее, лапласиан создает большее изображение.
Итак, как тренироваться? Сожмите птицу в исходном большом изображении, а затем сгенерируйте изображение для различения, а затем обучите его слой за слоем.
(6) EBGAN
Давайте посмотрим на EBGAN (GAN на основе энергии), который отказывается от концепции правильного и неправильного, упомянутой ранее. Он добавляет что-то, называемое энергией.После автоматического кодировщика Enc (промежуточные функции извлечения) и декодера Dec (вывод) он надеется сгенерировать реальное изображение с наименьшими затратами энергии, а фальшивое изображение с большей энергией.
«Генеративно-состязательная сеть на основе энергии» Цзюньбо Чжао, arXiv:1609.03126v2
Формула расчета функции потерь ее генератора и дискриминатора выглядит следующим образом (кусочная функция):
На изображении ниже показаны изображения, сгенерированные моделями GAN, EBGAN и EBGAN-PT.
4. Стратегия улучшения ГАН
Вы думали, что все проблемы решены? слишком молод.
Как показано на ошибке ниже, мы не можем судить о качестве обучения GAN.
GAN нужно обратить внимание на: стабильность (обучение не запускается), разнообразие (разные образцы), ясность (хорошее качество), и многие работы сейчас тоже решают эти три проблемы.
-
Могут ли итерации G и D достичь глобального оптимального решения? В большинстве случаев это локальный оптимум.
-
Он не обязательно сходится, скорость обучения не может быть высокой, G и D должны расти вместе, и нельзя расти слишком быстро
- Дискриминатор обучен слишком хорошо, градиент генератора исчезает, а потери генератора не могут уменьшиться
— Дискриминатор плохо обучен, градиент генератора неточный, бегает по кругу
-
Проблема сбоя. Обычно говорят, что G находит лазейку D и каждый раз генерирует один и тот же чит D.
-
Предварительно моделировать не надо, модель слишком вольная и неуправляемая
Почему у GAN есть эти проблемы, так это потому, что исходная статья GAN преобразует цель GAN в проблему расхождения KL, где и существуют эти ямы.
Это в конечном итоге приводит к смещению в сторону создания «безопасных» выборок.Как показано на рисунке ниже, целевая цель распределена равномерно, но в конечном итоге создается частичная и стабильная выборка.
-
Штраф «Генератору не удалось сгенерировать реальные образцы» невелик
-
Штраф "Генератор генерирует нереальные образцы" большой
Итак, есть ли обходной путь?
WGAN (Wasserstein GAN) был предложен в 2017 году, и его можно считать знаковой статьей в GAN, которая в принципе решает проблему GAN. Конкретные идеи таковы:
-
Последний слой дискриминатора удаляет сигмовидную
-
Потеря генератора и дискриминатора не лог.
-
После каждого обновления параметров дискриминатора усекайте их абсолютные значения не более чем до фиксированной константы c
-
Не используйте алгоритмы оптимизации на основе импульса (включая Momentum и Adam), рекомендуется использовать RMSProp, SGD.
-
Замена дивергенции KL на расстояние Вассерштейна значительно повышает стабильность обучающей сети, не придерживаясь тех стратегий DCGAN (трюков).
Были внесены последующие улучшения, и был предложен WGAN-GP (WGAN со штрафом за градиент), который не усекает, а только увеличивает штраф за градиент для создания изображений более высокого качества. Когда-то его называли «современным».
Далее те, кто занимается GAN, выйдут опровергать: «Кто бы ни сказал, что GAN не так хорош, как WGAN, мы добавляем Gradient Penalty, и у всех одинаковый эффект».
Результаты, как показано ниже:
«Мозг Google: созданы ли GAN равными? Крупномасштабное исследование» В этом документе подробно сравниваются различные варианты оптимизации димсам модели GAN.
Вывод из сравнения этой статьи состоит в том, что некоторые наборы данных говорят об определенных вещах, и ни один из них не превосходит другие. Хороший алгоритм тоже зависит от стоимости.Эффект от короткого времени сильный, а время обучения длинное, но будет хуже. По разным критериям оценки и разным сценариям алгоритм с плохим эффектом может и контратаковать. Промышленность уделяет больше внимания стабильности, например, WGAN.
Обратитесь, чтобы узнать ответ г-на Су Цзяньлиня
Прежде всего, с точки зрения полной теории исходный GAN (SGAN) представляет собой полную структуру GAN, за исключением того, что он может иметь риск исчезновения градиента. В статье сравнивается вопрос «чей эффект лучше, когда все стабильно тренируются к конвергенции». Ответ очевиден и легко просматривается: будь то СГАН или РГАН, теоретически все полны, но от разных. в распределении вероятностей, так что эффект почти нормальный.
Можно даже сказать, что теория SGAN является более полной (поскольку WGAN требует L ограничений, а различные добавления L ограничений в настоящее время имеют свои недостатки), поэтому, вообще говоря, эффект от SGAN лучше, чем от WGAN. Так каков же их вклад в WGAN? Характеристика WGAN заключается в том, что ее можно «стабильно обучить сходимости», в то время как SGAN относительно более вероятно разрушится. Таким образом, если вы сравните эффекты в соответствии с предпосылкой, что «каждый может стабильно тренироваться до конвергенции», это было бы несправедливо по отношению к моделям WGAN, потому что все они посвящены тому, как «стабилизировать обучение до конвергенции», и в этой статье это рассматривается непосредственно как главная предпосылка прямо сводит на нет вклад, сделанный WGAN.
4. Резюме
Написанная здесь, эта статья является окончанием введения, я надеюсь помочь вам. Прежде всего, большое спасибо за представление Мэйту, преподавателя колледжа Сяосян.Хотя статья очень избыточна, вы все равно можете получить знания, особенно для студентов, которые хотят изучать ГАН.Это очень хорошая популяризация. Конечно, по мере того, как автор будет углубляться, он будет делиться более краткими введениями и случаями и продолжит усердно работать~
Лично я считаю, что большая часть GAN используется в обучении с подкреплением, и у него есть приложения в области рекомендаций, состязательных образцов и безопасности.Я надеюсь, что по мере того, как автор будет углубляться, я смогу поделиться более практическими документами GAN . Например, если изображение изменено, сможет ли GAN вернуть его или оптимизировать решающий модуль в первый раз. Наконец, приведена сравнительная таблица различных моделей GAN.
1. Введение в ГАН
1. Базовые знания ГАН
2. Анализ принципа GAN
3. Классический кейс GAN
2. Предварительные сведения о GAN
1. Что такое нейронная сеть
2. Полностью связанный слой
3. Функция активации
4. Обратное распространение
5. Выбор оптимизатора
6. Сверточный слой
7. Слой объединения
8. Основные идеи задач изображения
3. Реальный боевой анализ сети GAN
1. Анализ модели ГАН
2. Создайте рукописный цифровой демонстрационный анализ
3. КГАН, ДКГАН, АКГАН, инфоГАН, ЛАПГАН, ЭБГАН
4. Стратегия улучшения ГАН
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~