Библиотека Google GAN с открытым исходным кодом — TFGAN

Google искусственный интеллект TensorFlow открытый источник

Эта статья содержит около 8000 слов, и ее чтение занимает около 12 минут.

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

Недавно Google открыл исходный код библиотеки на основе TensorFlow — TFGAN, которая удобна для разработчиков, чтобы быстро приступить к обучению GAN.Его адрес Github выглядит следующим образом:

GitHub.com/tensorflow/…

Исходный URL:Generative Adversarial Networks: Google open sources TensorFlow-GAN (TFGAN)


Если вы играли в Prince of Persia, то должны знать, что вам нужно защитить себя от того, чтобы вас не убила «Тень», но это тоже парадокс: если вы убьете «Тень», игра окончена, а вы этого не делаете. ничего, то и игра проиграна.

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

Эту проблему GAN также можно назвать общей проблемой сходимости. Хотя дискриминатор D и генератор D конкурируют друг с другом, они также полагаются друг на друга для эффективного обучения. Если один из них плохо обучен, вся система тоже будет плохой (это также проблема исчезающего градиента или коллапса моды, упомянутая ранее). И вам также нужно следить за тем, чтобы они не перетренировались, чтобы другая сторона не могла тренироваться. Так что Prince of Persia — интересная концепция.

Сначала были предложены нейронные сети для имитации человеческого мозга (пусть и искусственно). Они также добились успеха в распознавании объектов и обработке естественного языка. Однако по-прежнему существует огромный разрыв в мышлении и поведении людей.

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

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

Но на данный момент дело в том, что наши исследования GAN очень поверхностны, и предстоит решить еще много проблем. У GAN также есть много проблем, таких как невозможность различить, сколько конкретных объектов должно находиться в определенном месте, невозможность применить к 3D-объектам и невозможность понять общую структуру реального мира. Конечно, существует множество исследований по решению вышеперечисленных проблем, и новые модели также обеспечивают лучшую производительность.

Недавно, чтобы упростить реализацию GAN, Google спроектировала, разработала и открыла исходный код облегченной библиотеки на основе TensorFlow-TFGAN.

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

Кроме того,руководство, содержит высокоуровневый API для быстрого обучения модели с вашим собственным набором данных.

来源: research.googleblog.com

На рисунке выше показаны потери противника вСжатие изображенияаспектный эффект. Первый ряд картинок вверху взят изImageNetИзображение набора данных также является исходным входным изображением.Вторая строка в середине показывает эффекты сжатия и декомпрессии нейронной сети сжатия изображений, обученной традиционной функцией потерь.Нижняя строка представляет собой комбинацию традиционной функции потерь и Функция состязательных потерь В результате видно, что хотя состязательное изображение, основанное на потерях, не похоже на исходное изображение, оно дает более четкое и детальное изображение, чем сеть во второй строке.

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

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

начать использовать

Сначала добавьте следующий код, чтобы импортировать тензорный поток и объявить экземпляр TFGAN:

import tensorflow as tf
tfgan = tf.contrib.gan

Зачем использовать ТФГАН

  • Хорошо протестированный и гибкийинтерфейс вызоваОбеспечивает быстрое обучение сетей генераторов и дискриминаторов, а также возможность смешивания TFGAN, собственного кода TensorFlow и другого пользовательского кода платформы;
  • использовать реализованныйФункция потерь GAN и стратегия штрафов(например, потеря Вассерштейна, штраф за градиент и т. д.)
  • На этапе обучения ГАНМониторинг и визуализация операций,а такжеоцениватьгенерировать результаты
  • использовать реализованныйНавыкдля стабилизации и повышения производительности
  • Разработано на основе регулярных обучающих примеров GAN
  • использоватьGANEstimatorБыстро обучайте модель GAN в интерфейсе
  • Структурные улучшения TFGAN также автоматически улучшат производительность вашего проекта TFGAN.
  • TFGAN продолжит добавлять последние результаты алгоритмов исследования

Каковы компоненты TFGAN?

TFGAN состоит из нескольких компонентов, спроектированных как независимые, а именно:

  • core: Предоставляет основную структуру для обучения модели GAN. Процесс обучения разделен на четыре этапа, каждый этап можно пройти, используя собственный код или вызвав интерфейс библиотеки TFGAN;
  • features: содержит множество распространенных операций GAN и методов регуляризации, таких как нормализация экземпляра.
  • losses: содержит общие функции потерь GAN и механизмы штрафов, такие как потеря Вассерштейна, штраф за градиент, штраф за взаимную информацию и т. д.
  • evaulation: использовать предварительно обученную начальную сеть для использованияInception ScoreилиFrechet DistanceКритерии оценки для оценки безусловных генеративных моделей. Конечно, он также поддерживает использование самообучаемых классификаторов или других методов для оценки условных генеративных моделей.
  • examples and tutorial: примеры и учебные пособия для обучения моделей GAN с помощью TFGAN. Содержит модели, использующие безусловные и условные GAN, такие как InfoGAN и т. д.

Обучите модель GAN

Типичные этапы обучения модели GAN следующие:

  1. Укажите вход для вашей сети, такой как случайный шум или входное изображение (обычно используется в приложениях преобразования изображений, таких как модель pix2pixGAN)
  2. использоватьGANModelСети генератора определения интерфейса и дискриминатора
  3. использоватьGANLossУкажите функцию потерь для использования
  4. использоватьGANTrainOpsНастройте операцию обучения, т.е. оптимизатор
  5. начать обучение

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

Пример

Безусловная генерация изображений MNIST

Первый пример — обучение генератора генерировать изображения рукописных цифр, набор данных MNIST. На вход генератора поступает случайный шум, выбранный из многомерного равномерного распределения, а на выходе — цифровое изображение MNIST. Подробнее см. в документе«Генеративно-состязательные сети». код показывает, как показано ниже:

# 配置输入
# 真实数据来自 MNIST 数据集
images = mnist_data_provider.provide_data(FLAGS.batch_size)
# 生成器的输入,从多变量均匀分布采样得到的随机噪声
noise = tf.random_normal([FLAGS.batch_size, FLAGS.noise_dims])

# 调用 tfgan.gan_model() 函数定义生成器和判别器网络模型
gan_model = tfgan.gan_model(
    generator_fn=mnist.unconditional_generator,  
    discriminator_fn=mnist.unconditional_discriminator,  
    real_data=images,
    generator_inputs=noise)

# 调用 tfgan.gan_loss() 定义损失函数
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.wasserstein_generator_loss,
    discriminator_loss_fn=tfgan_losses.wasserstein_discriminator_loss)

# 调用 tfgan.gan_train_ops() 指定生成器和判别器的优化器
train_ops = tfgan.gan_train_ops(
    gan_model,
    gan_loss,
    generator_optimizer=tf.train.AdamOptimizer(gen_lr, 0.5),
    discriminator_optimizer=tf.train.AdamOptimizer(dis_lr, 0.5))

# tfgan.gan_train() 开始训练,并指定训练迭代次数 num_steps
tfgan.gan_train(
    train_ops,
    hooks=[tf.train.StopAtStepHook(num_steps=FLAGS.max_number_of_steps)],
    logdir=FLAGS.train_log_dir)
Условная генерация изображений MNIST

Второй пример также генерирует изображения MNIST, но на этот раз входом в генератор является не только случайный шум, но и метки классов.Эта модель GAN также называется условной GAN, и ее цель — предотвратить слишком свободное обучение GAN. Подробнее см. в документе«Условно-генеративные состязательные сети».

Что касается кода, вам нужно только изменить ввод и построить модели генератора и дискриминатора следующим образом:

# 配置输入
# 真实数据来自 MNIST 数据集,这里增加了类别标签--one_hot_labels
images, one_hot_labels = mnist_data_provider.provide_data(FLAGS.batch_size)
# 生成器的输入,从多变量均匀分布采样得到的随机噪声
noise = tf.random_normal([FLAGS.batch_size, FLAGS.noise_dims])

# 调用 tfgan.gan_model() 函数定义生成器和判别器网络模型
gan_model = tfgan.gan_model(
    generator_fn=mnist.conditional_generator,  
    discriminator_fn=mnist.conditional_discriminator,  
    real_data=images,
    generator_inputs=(noise, one_hot_labels)) # 生成器的输入增加了类别标签
    
# 剩余的代码保持一致
...
против потери

Третий пример сочетает потерю пикселей L1 и враждебную потерю, чтобы научиться автоматически кодировать изображения. Слой узкого места может использоваться для передачи сжатого представления изображения. Если используются только пиксельные потери, сеть будет генерировать только размытые изображения, но GAN можно использовать, чтобы сделать этот процесс восстановления изображения более реалистичным. Подробнее см. в документе«Сжатие изображений с полным разрешением с рекуррентными нейронными сетями»чтобы узнать, как реализовать сжатие изображений с помощью GAN, и документ«Фотореалистичное сверхвысокое разрешение одного изображения с использованием генеративной состязательной сети»Узнайте, как можно использовать GAN для повышения качества генерируемых изображений.

код показывает, как показано ниже:

# 配置输入
images = image_provider.provide_data(FLAGS.batch_size)

# 配置生成器和判别器网络
gan_model = tfgan.gan_model(
    generator_fn=nets.autoencoder,  # 自定义的 autoencoder
    discriminator_fn=nets.discriminator,  # 自定义的 discriminator
    real_data=images,
    generator_inputs=images)

# 建立 GAN loss 和 pixel loss
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.wasserstein_generator_loss,
    discriminator_loss_fn=tfgan_losses.wasserstein_discriminator_loss,
    gradient_penalty=1.0)
l1_pixel_loss = tf.norm(gan_model.real_data - gan_model.generated_data, ord=1)

# 结合两个 loss
gan_loss = tfgan.losses.combine_adversarial_loss(
    gan_loss, gan_model, l1_pixel_loss, weight_factor=FLAGS.weight_factor)

# 剩下代码保持一致
...
преобразование изображений

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

код показывает, как показано ниже:

# 配置输入,注意增加了 target_image
input_image, target_image = data_provider.provide_data(FLAGS.batch_size)

# 配置生成器和判别器网络
gan_model = tfgan.gan_model(
    generator_fn=nets.generator,  
    discriminator_fn=nets.discriminator,  
    real_data=target_image,
    generator_inputs=input_image)

#  建立 GAN loss 和 pixel loss
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.least_squares_generator_loss,
    discriminator_loss_fn=tfgan_losses.least_squares_discriminator_loss)
l1_pixel_loss = tf.norm(gan_model.real_data - gan_model.generated_data, ord=1)

# 结合两个 loss
gan_loss = tfgan.losses.combine_adversarial_loss(
    gan_loss, gan_model, l1_pixel_loss, weight_factor=FLAGS.weight_factor)

# 剩下代码保持一致
...
InfoGAN

В последнем примере используется модель InfoGAN для создания изображений MNIST, но без каких-либо меток для управления типом генерируемых цифр. Подробности смотрите в статье«InfoGAN: обучение интерпретируемому представлению с помощью информации, максимизирующей генеративные состязательные сети».

код показывает, как показано ниже:

# 配置输入
images = mnist_data_provider.provide_data(FLAGS.batch_size)

# 配置生成器和判别器网络
gan_model = tfgan.infogan_model(
    generator_fn=mnist.infogan_generator,  
    discriminator_fn=mnist.infogran_discriminator,  
    real_data=images,
    unstructured_generator_inputs=unstructured_inputs,  # 自定义输入
    structured_generator_inputs=structured_inputs)  # 自定义

# 配置 GAN loss 以及相互信息惩罚
gan_loss = tfgan.gan_loss(
    gan_model,
    generator_loss_fn=tfgan_losses.wasserstein_generator_loss,
    discriminator_loss_fn=tfgan_losses.wasserstein_discriminator_loss,
    gradient_penalty=1.0,
    mutual_information_penalty_weight=1.0)

# 剩下代码保持一致
...
Создание пользовательских моделей

Наконец, тот же безусловный GAN генерирует изображения MNIST, но используетGANModelФункция для настройки дополнительных параметров для более точного управления созданием модели.

код показывает, как показано ниже:

# 配置输入
images = mnist_data_provider.provide_data(FLAGS.batch_size)
noise = tf.random_normal([FLAGS.batch_size, FLAGS.noise_dims])

# 手动定义生成器和判别器模型
with tf.variable_scope('Generator') as gen_scope:
  generated_images = generator_fn(noise)
with tf.variable_scope('Discriminator') as dis_scope:
  discriminator_gen_outputs = discriminator_fn(generated_images)
with variable_scope.variable_scope(dis_scope, reuse=True):
  discriminator_real_outputs = discriminator_fn(images)
generator_variables = variables_lib.get_trainable_variables(gen_scope)
discriminator_variables = variables_lib.get_trainable_variables(dis_scope)

# 依赖于你需要使用的 TFGAN 特征,你并不需要指定 `GANModel`函数的每个参数,不过
# 最少也需要指定判别器的输出和变量
gan_model = tfgan.GANModel(
    generator_inputs,
    generated_data,
    generator_variables,
    gen_scope,
    generator_fn,
    real_data,
    discriminator_real_outputs,
    discriminator_gen_outputs,
    discriminator_variables,
    dis_scope,
    discriminator_fn)

# 剩下代码和第一个例子一样
...

Наконец, адрес Github TFGAN снова указан следующим образом:

GitHub.com/tensorflow/…


Если есть какие-либо неуместные переводы или какие-либо предложения и мнения, пожалуйста, оставьте сообщение для обмена; также приглашаем обратить внимание на мой общедоступный аккаунт WeChat - машинное обучение и компьютерное зрение или отсканируйте QR-код ниже, поделитесь со мной своими предложениями и мнениями, и поправьте меня В статье могут быть ошибки, давайте общаться, учиться и прогрессировать вместе!