Используйте Experiment Manager для обучения генеративных состязательных сетей (GAN)

В этом примере показано, как создать пользовательский обучающий эксперимент для обучения генеративной состязательной сети (GAN), которая генерирует изображения цветов. Для пользовательского обучающего эксперимента вы явным образом задаете процедуру обучения, используемую Experiment Manager. В этом примере вы реализуете пользовательский цикл обучения для обучения GAN, типа нейронной сети для глубокого обучения, которая может генерировать данные с такими же характеристиками, как входные реальные данные. GAN состоит из двух сетей, которые обучаются вместе:

  • Генератор - Учитывая вектор случайных значений (латентные входы) в качестве входных данных, эта сеть генерирует данные с той же структурой, что и обучающие данные.

  • Дискриминатор - Учитывая пакеты данных, содержащих наблюдения как от обучающих данных, так и от сгенерированных данных от генератора, эта сеть пытается классифицировать наблюдения как «реальные» или «сгенерированные».

Чтобы обучить GAN, обучите обе сети одновременно, чтобы максимизировать эффективность обеих сетей:

  • Обучите генератор генерировать данные, которые «дурачат» дискриминатор. Чтобы оптимизировать эффективность генератора, максимизируйте потерю дискриминатора, когда даны сгенерированные данные. Другими словами, цель генератора состоит в том, чтобы сгенерировать данные, которые дискриминатор классифицирует как «действительные».

  • Обучите дискриминатор различать реальные и сгенерированные данные. Чтобы оптимизировать эффективность дискриминатора, минимизируйте потерю дискриминатора, когда заданы пакеты как реальных, так и сгенерированных данных. Другими словами, цель дискриминатора состоит в том, чтобы генератор не «обманул».

В идеале эти стратегии приводят к генератору, который генерирует убедительно реалистичные данные, и дискриминатору, который научился сильным представлениям функций, которые характерны для обучающих данных. Для получения дополнительной информации смотрите Train Генеративной Состязательной Сети (GAN).

Открытый эксперимент

Сначала откройте пример. Experiment Manager загружает проект с помощью предварительно сконфигурированного эксперимента, который можно просмотреть и запустить. Чтобы открыть эксперимент, в панели Experiment Browser дважды кликните имя эксперимента (ImageGenerationExperiment).

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

Поле Description содержит текстовое описание эксперимента. В данном примере описанием является:

Train a generative adversarial network (GAN) to generate images of flowers.
Use hyperparameters to specify:
- the probability of the dropout layer in the discriminator network
- the fraction of real labels to flip while training the discriminator network

Раздел «Гиперпараметры» задает значения гиперзначений параметров, используемые для эксперимента. Когда вы запускаете эксперимент, Experiment Manager обучает сеть с помощью каждой комбинации значений гиперзначений параметров, заданных в таблице гиперпараметра. Этот пример использует два гиперпараметра:

  • dropoutProb устанавливает вероятность выпадающего слоя в сети дискриминатора. По умолчанию значения для этого гиперпараметра заданы как [0.25 0.5 0.75].

  • flipFactor устанавливает долю действительных меток, чтобы развернуться, когда вы обучаете сеть дискриминатора. Эксперимент использует этот гиперпараметр, чтобы добавить шум к реальным данным и лучше сбалансировать обучение дискриминатора и генератора. В противном случае, если дискриминатор учится различать реальные и сгенерированные изображения слишком быстро, то генератор может не обучаться. Значения для этого гиперпараметра заданы как [0.1 0.3 0.5].

Функция обучения задает обучающие данные, сетевую архитектуру, опции обучения и процедуру обучения, используемые экспериментом. Чтобы просмотреть функцию обучения, в разделе Training Function нажатия кнопки Edit. Функция обучения откроется в MATLAB ® Editor.

Вход функции обучения представляет собой структуру с полями из таблицы гиперпараметров и experiments.Monitor объект, который можно использовать, чтобы отслеживать прогресс обучения, записывать значения метрик, используемых в обучении, и создавать обучающие графики. Функция обучения возвращает структуру, которая содержит обученную сеть генератора, обученную сеть дискриминатора и окружение выполнения, используемую для обучения. Experiment Manager сохраняет этот выход, поэтому можно экспортировать ее в Рабочее пространство MATLAB по завершении обучения. Функция обучения состоит из шести разделов.

  • Initialize Output устанавливает начальное значение сетей в пустые массивы, чтобы указать, что обучение не началось. Эксперимент устанавливает окружение выполнения на "auto", поэтому он обучает сети на графическом процессоре, если он доступен. Для использования графический процессор требуется Parallel Computing Toolbox™ и поддерживаемый графический процессор. Для получения дополнительной информации смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

  • Load Training Data определяет обучающие данные для эксперимента как imageDatastore объект. В эксперименте используется набор данных Flowers, который содержит 3670 изображений цветов и составляет около 218 МБ. Дополнительные сведения об этом наборе данных см. в разделе Наборы данных изображений.

  • Определите Сеть Генератора, определяет архитектуру для сети генератора как график слоев, который производит изображения от массивов случайных значений 1 на 1 на 100. Чтобы обучить сеть с помощью пользовательского цикла обучения и включить автоматическую дифференциацию, функция обучения преобразует график слоев в dlnetwork объект.

  • Определите Сеть Дискриминатора, определяет архитектуру для сети дискриминатора как график слоев, который классифицирует реальный и произвел изображения 64 на 64 на 3. Слой отсева использует вероятность отсева, заданную в таблице гиперпараметров. Чтобы обучить сеть с помощью пользовательского цикла обучения и включить автоматическую дифференциацию, функция обучения преобразует график слоев в dlnetwork объект.

  • Настройка опций обучения определяет опции обучения, используемые экспериментом. В этом примере Experiment Manager обучает сети с размером мини-пакета 128 в течение 50 эпох, используя начальную скорость обучения 0,0002, коэффициент градиентного распада 0,5 и квадратный коэффициент градиентного распада 0,999.

  • Train задаёт пользовательский цикл обучения, используемый экспериментом. Пользовательский цикл обучения использует minibatchqueue для обработки и управления мини-пакетами изображений. Для каждого мини-пакета, minibatchqueue объект пересматривает изображения в области значений [-1,1], отбрасывает любые частичные мини-пакеты с менее чем 128 наблюдениями и форматирует данные изображения с метками размерностей 'SSCB' (пространственный, пространственный, канальный, пакетный). По умолчанию в minibatchqueue объект преобразует данные в dlarray объекты с базовым типом single. Для каждой эпохи пользовательский цикл обучения перетаскивает datastore и закольцовывает мини-пакеты данных. Если вы обучаетесь на графическом процессоре, данные преобразуются в gpuArray объекты. Затем функция обучения оценивает градиенты модели и обновляет параметры сети дискриминатора и генератора. После каждой итерации пользовательского цикла обучения функция обучения сохраняет обученные сети и обновляет процесс обучения.

Обучение GAN может быть сложной задачей, потому что генератор и сети дискриминаторов конкурируют друг с другом во время обучения. Если одна сеть учится слишком быстро, то другая сеть может не научиться. Чтобы помочь вам диагностировать проблемы и контролировать, насколько хорошо генератор и дискриминатор достигают своих соответствующих целей, этот эксперимент отображает пару счетов на графике обучения. Генератор счета scoreGenerator измеряет вероятность того, что дискриминатор может правильно различать сгенерированные изображения. Дискриминатор счета scoreDiscriminator измеряет вероятность того, что дискриминатор может правильно различать все входные изображения, принимая, что количества реальных и сгенерированных изображений, переданных дискриминатору, равны. В идеальном случае оба счетов равны 0,5. Счета, которые слишком близки к нулю или один может указать, что одна сеть доминирует над другой. См. «Мониторинг процесса обучения GAN» и «Идентификация распространенных типов отказа».

Чтобы помочь вам решить, какое испытание дает лучшие результаты, этот эксперимент объединяет счет генератора и счетов дискриминатора в одно числовое значение, scoreCombined. Эта метрика использует норму L-∞, чтобы определить, насколько близки две сети от идеального сценария. Это принимает значение единицы, если обе сети счетов равными 0,5, и нули, если одна из счетов сети равна нулю или единице.

Запуск эксперимента

Когда вы запускаете эксперимент, Experiment Manager обучает сеть, заданную функцией обучения, несколько раз. В каждом испытании используется разная комбинация значений гиперзначений параметров. По умолчанию Experiment Manager запускает по одной пробной версии за раз. Если у вас есть Parallel Computing Toolbox, можно запустить несколько испытаний одновременно. Для достижения наилучших результатов, прежде чем вы запустите свой эксперимент, запустите параллельный пул с таким количеством работников, как графические процессоры. Для получения дополнительной информации смотрите Использование Experiment Manager для параллельного обучения сетей.

  • Чтобы запустить по одной пробной версии эксперимента за раз, на панели инструментов Experiment Manager нажмите кнопку Запустить.

  • Чтобы запустить несколько испытаний одновременно, щелкните Использовать Параллель (Use Parallel) и затем Запуск. Если текущий параллельный пул отсутствует, Experiment Manager запускает его с помощью профиля кластера по умолчанию. Затем Experiment Manager выполняет несколько одновременных испытаний, в зависимости от количества доступных параллельных работников.

Таблица результатов отображает потери обучения и точность валидации для каждого испытания.

Во время выполнения эксперимента нажмите Training Plot, чтобы отобразить график обучения и отследить прогресс в каждом испытании.

Оценка результатов

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

  1. Укажите столбец scoreCombined.

  2. Щелкните значок треугольника.

  3. Выберите Сортировка в порядке убывания.

Испытание с самым высоким комбинированным счетом появляется в верхней части таблицы результатов.

Оцените качество GAN, сгенерировав и осмотрев изображения, произведенные обученным генератором.

  1. Выберите пробную версию с самым высоким комбинированным счетом.

  2. На панели инструментов Experiment Manager нажмите кнопку Экспорт.

  3. В диалоговом окне введите имя переменной рабочей области для экспортированного выхода обучения. Имя по умолчанию trainingOutput.

  4. Протестируйте обученную сеть генератора путем вызова generateTestImages функция. Используйте экспортированный выход обучения как вход в функцию. Для образца в Командном Окне MATLAB введите:

generateTestImages(trainingOutput)

Функция создает пакет из 25 случайных векторов для ввода в сеть генератора и отображает получившиеся изображения.

Использование комбинированного счета для сортировки результатов может не идентифицировать лучшее испытание во всех случаях. Для наилучших результатов повторите этот процесс для каждого испытания с высоким комбинированным счетом, визуально проверяя, что генератор производит множество изображений без многих дубликатов. Если изображения имеют небольшое разнообразие, и некоторые из них почти идентичны, то на ваш генератор, вероятно, влияет свертывание режима. Для получения дополнительной информации см. Раздел «Свернуть режим».

Чтобы записать наблюдения о результатах эксперимента, добавьте аннотацию.

  1. В таблице результатов щелкните правой кнопкой мыши камеру scoreCombined для лучшего испытания.

  2. Выберите «Добавить аннотацию».

  3. На панели аннотации введите свои наблюдения в текстовое поле.

Для получения дополнительной информации см. Раздел «Сортировка, фильтрация и аннотация результатов эксперимента».

Повторный эксперимент

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

  1. Вернитесь к панели определения эксперимента.

  2. В таблице гиперпараметров введите значения гиперзначений параметров из вашего лучшего исследования. Для примера, чтобы использовать значения из пробной версии 2, измените значение dropoutProb на 0.5 и flipFactor на 0.1.

  3. Откройте функцию обучения и задайте более длительное время обучения. В разделе «Задать опции обучения» измените значение numEpochs на 500.

  4. Запустите эксперимент с помощью новых значений гиперзначений параметров и функции обучения. Experiment Manager запускает одну пробную версию. Обучение занимает примерно в 10 раз больше, чем предыдущие испытания.

  5. Когда эксперимент закончится, экспортируйте выход обучения и запустите generateTestImages функция для тестирования новой сети генератора. Как и прежде, визуально проверяйте, что генератор производит множество изображений без множества дубликатов.

Закройте эксперимент

На панели браузера экспериментов щелкните правой кнопкой мыши имя проекта и выберите «Закрыть проект». Experiment Manager закрывает все эксперименты и результаты, содержащиеся в проекте.

См. также

Приложения

Объекты

Похожие темы