Генеративно-состязательная нейросеть: ваша первая GAN-модель на PyTorch |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2020-08-11 14:25 Текст статьи представляет собой незначительно сокращенный перевод публикации Ренато КандидоGenerative Adversarial Networks: Build Your First Models. Генеративно-состязательные сети (англ. Generative adversarial networks, сокр. GAN) –нейронные сети, которые умеют генерировать изображения, музыку, речь и тексты, похожие на те, что делают люди. GAN стали активной темой исследований последних лет. Директор лаборатории искусственного интеллекта FacebookЯн Лекунназвал состязательное обучение «самой интересной идеей в области машинного обучения за последние 10 лет». Ниже мы изучим, как работают GAN и создадим две модели с помощьюфреймворка глубокого обученияPyTorch. Примечание Материал этой статьи требует хотя бы поверхностного знакомства с нейросетями и Python. Вводные сведения об устройстве нейросетей можно получить из публикации «Наглядное введение в нейросети на примере распознавания цифр». Что такое генеративно-состязательная нейросеть? Генеративно-состязательная нейросеть(англ. Generative adversarial network, сокращённо GAN) – это модель машинного обучения, умеющая имитировать заданное распределение данных. Впервые модель была предложена встатье NeurIPS2014 г. экспертом в глубоком обучении Яном Гудфеллоу и его коллегами. GAN состоят из двух нейронных сетей, одна из которых обучена генерировать данные, а другая – отличать смоделированные данные от реальных (отсюда и «состязательный» характер модели). Генеративно-состязательные нейросети показывают впечатляющие результаты в отношении генерации изображений и видео:
Тест Последним успехам нейросетей посвящен тест Библиотеки программиста «Правда или ложь: что умеют нейросети?» GAN и другие структуры, генерирующие данные, называютгенеративными моделямив противовес более широко изученнымдискриминативным моделям. Прежде чем погрузиться в GAN, посмотрим на различия между двумя типами моделей. Сравнение дискриминативных и генеративных моделей машинного обучения Дискриминативные модели используются для большинства задач«обучения с учителем»наклассификациюилирегрессию. В качестве примера проблемы классификации предположим, что нужно обучитьмодель распознавания изображений рукописных цифр. Для этого мы можем использовать маркированный набор данных, содержащий фотографии рукописных цифр, которым соотнесены сами цифры. Обучение сводится к настройке параметров модели с помощью специального алгоритма,минимизирующего функцию потерь. Функция потерь – критерий расхождения между истинным значением оцениваемого параметра и его ожиданием. После фазы обучения мы можем использовать модель для классификации нового (ранее не рассматриваемого) изображения рукописной цифры, сопоставив входному изображению наиболее вероятную цифру. Дискриминативная модель использует обучающие данные для нахождения границ между классами. Найденные границы используются, чтобы различить новые входные данные и предсказать их класс. В математическом отношении дискриминативные модели изучаютусловную вероятностьP(y|x)наблюденияyпри заданном входеx. Дискриминативные модели – это не только нейронные сети, но илогистическая регрессия, иметод опорных векторов (SVM). В то время как дискриминативные модели используются для контролируемого обучения, генеративные модели обычно используют неразмеченный набор данных, то есть могут рассматриваться как формаобучения без учителя. Так, используя набор данных из рукописных цифр, можно обучить генеративную модель для генерации новых изображений. В отличие от дискриминативных моделей, генеративные модели изучают свойствафункции вероятностиP(x)входных данных?x. В результате они порождают не предсказание, а новый объект со свойствами, родственными обучающему набору данных. Помимо GAN существуют другие генеративные архитектуры:
В последнее время GAN привлекли большое внимание благодаря впечатляющим результатам в генерации визуального контента. Остановимся на устройстве генеративно-состязательных сетей подробнее. Архитектура генеративно-состязательных нейросетей Генеративно-состязательная сеть, как мы уже поняли, – это не одна сеть, а две: генератор и дискриминатор. Рольгенератора– сгенерировать на основе реальной выборки датасет, напоминающий реальные данные.Дискриминаторобучен оценивать вероятность того, что образец получен из реальных данных, а не предоставлен генератором. Две нейросети играют в кошки-мышки: генератор пытается обмануть дискриминатор, а дискриминатор старается лучше идентифицировать сгенерированные образцы. Чтобы понять, как работает обучение GAN, рассмотрим игрушечный пример с набором данных, состоящим из двумерных выборок(x1, x2), сx1в интервале от0до2?иx2=sin(x1). Общая структура GAN для генерации пар (x?1, x?2), напоминающих точки из набора данных, показана на следующем рисунке. Генератор На вход дискриминатора Как и в случае с генератором, можно выбрать любую структуру нейронной сети В математическом плане процесс обучения GAN заключается вминимаксной игредвух игроков, в которой На каждом этапе обучения происходит обновление параметров моделей Для каждой партии обучающих данных, содержащих размеченные реальные и сгенерированные образцы, мы обновляем набор параметров модели Когда Теперь, когда мы знаем, как работает GAN, мы готовы реализовать собственный вариант нейросети, используяPyTorch. Ваша первая генеративно-состязательная нейросеть В качестве первого эксперимента с генеративно-состязательными сетями реализуем описаный выше пример с гармонической функцией. Для работы с примером будем использовать популярную библиотеку PyTorch, которую можно установить с помощьюинструкции. Если вы серьезно заинтересовались Data Science, возможно, вы уже использовали дистрибутивAnacondaи систему управления пакетами и средамиconda. Заметим, что среда облегчает процесс установки. Устанавливаея PyTorch с помощью Здесь создается окружение Поскольку PyTorch является активно развивающейся средой, API в новых версиях может измениться. Примеры кода проверены для версии 1.4.0. Для работы с графиками мы будем использовать matplotlib. Jupyter Notebook Организация кода в виде блокнотов Jupyter облегчает работу над проектами машинного обучения. Поэтому данную статью вместе с кодом для удобства читателей мы адаптировали и в виде Jupyter-блокнота. При использовании Jupyter Notebook необходимо зарегистрировать окружение Начнём с импорта необходимых библиотек: Здесь мы импортируем библиотеку PyTorch ( Хорошей практикой является временное закрепление генератора случайных чисел так, чтобы эксперимент можно было воспроизвести на другой машине. Чтобы сделать это в PyTorch, запустим следующий код: Число Подготовка данных для обучения GAN Обучающая выборка состоит из пар чисел(x1, x2)– таких, чтоx2соответствует значению синусаx1дляx1в интервале от0до2?. Данные для обучения можно получить следующим образом: Здесь мы составляем набор данных для обучения, состоящий из 1024 пар(x1, x2). Затем инициализируем нулями Первый столбец Затем нам формально потребуется массив меток Наконец, мы создаем из Отобразим данные для обучения, нанеся на график каждую точку(x1, x2): Создадим загрузчик данных с именем Данные подготовлены, теперь нужно создать нейронные сети дискриминатора и генератора GAN. Реализация дискриминатора GAN В PyTorch модели нейронной сети представлены классами, которые наследуются от класса Дискриминатор – это модель с двумерным входом и одномерным выходом. Он получает выборку из реальных данных или от генератора и предоставляет вероятность того, что выборка относится к реальным обучающим данным. Код ниже показывает, как создать класс дискриминатора. Для построения модели нейронной сети используется стандартный метод классов
Для удобства вывода в классе также создан метод После объявления класса дискриминатора создаем его экземпляр: Реализация генератора GAN В генеративно-состязательных сетях генератор – это модель, которая берет в качестве входных данных некоторую выборку изпространства скрытых переменных, напоминающих данные в обучающем наборе. В нашем случае это модель с двумерным вводом, которая будет получать случайные точки (z1, z2), и двумерный вывод, выдающий точки (x?1, x?2), похожие на точки из обучающих данных. Реализация похожа на то, что мы написали для дискриминатора. Сначала нужно создать класс Генератор включает два скрытых слоя с 16 и 32 нейронами с функцией активацией ReLU, а на выходе слой с двумя нейронами с линейной функцией активации. Таким образом, выходные данные будут состоять из двух элементов, имеющих значение в диапазоне от??до+?, которое будет представлять(x?1, x?2). То есть исходно мы не накладываем на генератор никакие ограничения – он должен «всему научиться сам». Теперь, когда мы определили модели для дискриминатора и генератора, мы готовы начать обучение. Обучение моделей GAN Перед обучением моделей необходимо настроить параметры, которые будут использоваться в процессе обучения: Что здесь происходит:
Правила обновления весов (обучения модели) в PyTorch реализованы в модуле Наконец, необходимо реализовать обучающий цикл, в котором образцы обучающей выборки подаются на вход модели, а их веса обновляются, минимизируя функцию потерь: Здесь на каждой итерации обучения мы обновляем параметры дискриминатора и генератора. Как это обычно делается для нейронных сетей, учебный процесс состоит из двух вложенных циклов: внешний – для эпох обучения, а внутренний – для пакетов внутри каждой эпохи. Во внутреннем цикле всё начинается с подготовки данных для обучения дискриминатора:
В следующем блоке мы обучаем дискриминатор:
Тренируем генератор:
Наконец, в последних строчках цикла происходит вывод значения функций потерь дискриминатора и генератора в конце каждой десятой эпохи. Проверка образцов, сгенерированных GAN Генеративно-состязательные сети предназначены для генерации данных. Таким образом, после того как процесс обучения завершен, мы можем вызвать генератор для получения новых данных: Построим сгенерированные данные и проверим, насколько они похожи на обучающие данные. Перед построением графика для сгенерированных образцов необходимо применить метод Распределение сгенерированных данных очень напоминает реальные данные – исходный синус. Анимацию эволюции обучения можно посмотреть по ссылке. В начале процесса обучения распределение сгенерированных данных сильно отличается от реальных данных. Но по мере обучения генератор изучает реальное распределение данных, как бы подстраиваясь под него. Теперь, когда мы реализовали первую модель генеративно-состязательной сети, мы можем перейти к более практичному примеру с генерацией изображений. Генератор рукописных цифр с GAN В следующем примере мы воспользуемся GAN для генерации изображений рукописных цифр. Для этого мы обучим модели, используянабор данных MNIST, состоящий из рукописных цифр. Этот стандартный набор данных включен в пакет Для начала в активированной среде Опять же, здесь мы указываем конкретную версию Начинаем с импорта необходимых библиотек: Помимо библиотек, которые мы импортировали ранее, нам понадобится Поскольку в этом примере обучающий набор включает изображения, модели будут сложнее, обучение будет происходить существенно дольше. При обучении на центральном процессоре (CPU) на одну эпоху будет уходить порядка двух минут. Для получения приемлемого результата понадобится порядка 50 эпох, поэтому общее время обучения при использовании процессора составляет около 100 минут. Чтобы сократить время обучения, можно использовать графический процессор (GPU). Чтобы код работал независимо от характеристик компьютера, создадим объект Окружение настроено, подготовим датасет для обучения. Подготовка датасета MNIST Набор данных MNIST состоит из изображений написанных от руки цифр от 0 до 9. Изображения выполнены в градациях серого и имеют размер 28 ? 28 пикселей. Чтобы использовать их с PyTorch, понадобится выполнить некоторые преобразования. Для этого определим функцию Функция состоит из двух частей:
Исходные коэффициенты, заданные функцией Технические детали Аргументы Функция Теперь можно загрузить обучающие данные, вызвав Аргумент Мы создали Для избирательного построения данных воспользуемся matplotlib. В качестве палитры хорошо подходит Как видите, в датасете есть цифры с разными почерками. По мере того как GAN изучает распределение данных, она также генерирует цифры с разными стилями рукописного ввода. Мы подготовили обучающие данные, можно реализовать модели дискриминатора и генератора. Реализация дискриминатора и генератора В рассматриваемом случае дискриминатором является нейронная сеть многослойного перцептрона, которая принимает изображение размером 28 ? 28 пикселей и находит вероятность того, что изображение принадлежит реальным обучающим данным. Для введения коэффициентов изображения в нейронную сеть перцептрона, необходимо их векторизовать так, чтобы нейронная сеть получала вектор, состоящий из 784 коэффициентов (28 ? 28 = 784). Векторизация происходит в первой строке метода Чтобы запустить модель дискриминатора с использованием графического процессора, нужно создать его экземпляр и связать с объектом устройства с помощью метода Генератор будет создавать более сложные данные, чем в предыдущем примере. Поэтому необходимо увеличить размеры входных данных, используемых для инициализации. Здесь мы используем 100-мерный вход и выход с 784 коэффициентами. Результат организуется в виде тензора 28 ? 28, представляющего изображение. Выходные коэффициенты должны находиться в интервале от -1 до 1. Поэтому на выходе генератора мы используем гиперболическую функцию активации Осталось лишь обучить модели. Обучение моделей Для обучения моделей нужно определить параметры обучения и оптимизаторы: Мы уменьшаем скорость обучения по сравнению с предыдущим примером. Чтобы сократить время обучения, устанавливаем количество эпох равным 50. Цикл обучения похож на тот, что мы использовали в предыдущем примере: Проверка сгенерированных GAN образцов Сгенерируем несколько образцов «рукописных цифр». Для этого передадим генератору инициирующий набор случайных чисел: Чтобы построить сгенерированные выборки, нужно переместить данные обратно в центральный процессор, если их обработка происходила на графическом процессоре. Для этого достаточно вызвать метод На выходе должны получиться цифры, напоминающие обучающие данные. После пятидесяти эпох обучения есть несколько цифр, будто бы написанных рукой человека. Результаты можно улучшить, проводя более длительное обучение (с бо?льшим количеством эпох). Как и в предыдущем примере, можно визуализировать эволюцию обучения, используя фиксированный тензор входных данных и подавая его на генератор в конце каждой эпохи (анимация эволюции обучения). В начале процесса обучения сгенерированные изображения абсолютно случайны. По мере обучения генератор изучает распределение реальных данных, и примерно через двадцать эпох некоторые сгенерированные изображения цифр уже напоминают реальные данные. Заключение Поздравляем! Вы узнали, как реализовать собственную генеративно-состязательную нейросеть. Сначала мы построили игрушечный пример, чтобы понять структуру GAN, а затем рассмотрели сеть для генерации изображений по имеющимся примерам данных. Несмотря на сложность тематики GAN, интегрированные среды машинного обучения, такие как PyTorch, делают реализацию очень легкой. В этом тексте вы, возможно, встретили множество новых понятий. Если вы серьезно заинтересовались профессией Data Science, хорошим ориентиром будет наша публикация «Как научиться Data Science онлайн: 12 шагов от новичка до профи». *** Этот материал мы подготовили при поддержке компании GeekBrains – нашего партнёра, предоставляющего помощь в освоении Data Science и машинного обучения. Если вы хотите получить знания, не тратя лишние время и силы на поиск знаний, инструментов и привыкание к разному стилю чтения курсов, обратите внимание на факультет Искусственного интеллекта. Программа и преподаватели имеют высокие оценки учащихся, а при успешном прохождении курса онлайн-университет гарантирует не только диплом, но и трудоустройство. Интересно, хочу попробовать Источники Источник: proglib.io Комментарии: |
|