www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Интуитивное руководство по передаче нейронного стиля

Дата публикации Jan 8, 2019

Предоставлено Pixabay.com

Введение

Нейронный стиль передачи (NST) - очень аккуратная идея. NST основывается на ключевой идее, что

возможно разделить представление стиля и представления контента в CNN, изученные во время задачи компьютерного зрения (например, задачи распознавания изображений).

Следуя этой концепции, NST использует нейронную сеть с предварительно подготовленной сверткой (CNN) для передачи стилей из одного изображения в другое. Это делается путем определения функции потерь, которая пытается минимизировать различия между изображением контента, изображением стиля и сгенерированным изображением, что будет подробно обсуждаться позже. К концу этого урока вы сможете создать очень классную иллюстрацию, как показано ниже.

Этот учебник будет охватывать следующие части в следующих разделах учебника.

  • Почему передача нейронного стиля и архитектура высокого уровня
  • Загрузка весов VGG 16 в качестве предварительно обученных весов сети
  • Определение входов, выходов, потерь и оптимизатора для сети передачи нейронного стиля
  • Определение входного конвейера для подачи данных в сеть
  • Обучение сети и сохранение результатов
  • Вывод

Другие статьи этой серии можно найти ниже.

A BСD* E Fг* H I JКL* M N O P Q R S T U VWX Y Z

* обозначает статьи за Средним платным доступом

Цель этой статьи

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

Код

Обратите внимание, что я буду делиться только самыми важными фрагментами кода в статье. Вы можете получить полный код как блокнот JupyterВот, Алгоритм реализован сTensorFlow,

Почему НСТ?

Глубокие нейронные сети уже превзошли показатели человеческого уровня в таких задачах, как распознавание и обнаружение объектов. Однако до недавних пор глубокие сети значительно отставали в таких задачах, как создание художественных артефактов, имеющих высокое качество восприятия. Создание искусства более высокого качества с использованием методов машинного обучения необходимо для достижения человеческих способностей, а также открывает новый спектр возможностей. И с развитием компьютерного оборудования, а также распространением глубокого обучения, глубокое обучение сейчас используется для создания искусства. Например,Искусство, созданное ИИ, не будет продано на аукционеза колоссальные 432 500 долларов.

Архитектура высокого уровня

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

  • Изображение контента (с) - изображение, которому мы хотим передать стиль
  • Стиль изображения (s) - изображение, из которого мы хотим передать стиль
  • Входное (сгенерированное) изображение (г) - изображение, которое содержит конечный результат (единственная обучаемая переменная)

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

Архитектура высокого уровня модели NST

Загрузка и загрузка предварительно обученного VGG-16

Вы будете заимствовать веса VGG-16 отэта веб-страница, Вам нужно будет скачатьvgg16_weights.npzфайл ипоместите это в папку с именемvggв вашем домашнем каталоге проекта(извините, я должен был это автоматизировать, но мне было лень). Вам понадобятся только свертка и объединяющие слои. В частности, вы будете загружать первый7сверточные слои для использования в качестве сети NST. Вы можете сделать это с помощьюload_weights(...)Функция приведена в записной книжке.

Заметка: Вы можете попробовать больше слоев. Но остерегайтесь ограничений памяти вашего процессора и графического процессора.

Определение функций для построения стиля передачи сети

Здесь вы определяете несколько функций, которые позже помогут вам полностью определить вычислительный граф CNN с учетом входных данных.

Создание переменных TensorFlow

Здесь вы загружаете загруженные массивы в переменные TensorFlow. Мы будем создавать следующие переменные:

  • изображение контента (tf.placeholder)
  • стиль изображения (tf.placeholder)
  • сгенерированное изображение (tf.Variableа такжеtrainable=True)
  • предварительно обученные веса и уклоны (tf.Variableа такжеtrainable=False)

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

Вычисление чистой выработки VGG

Здесь вы вычисляете выход VGG net с помощью операций свертки и объединения. Обратите внимание, что вы заменяетеtf.nn.max_poolсtf.nn.avg_poolоперация, какtf.nn.avg_poolдает лучшие визуально приятные результаты при передаче стиля [1]. Не стесняйтесь экспериментировать сtf.nn.max_poolизменив операцию в функции ниже.

Функции потери

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

Функция стоимости контента

Функция стоимости контента следит за тем, чтобы контент, представленный в изображении контента, был захвачен в сгенерированном изображении. Было обнаружено, что CNN собирают информацию о контенте на более высоких уровнях, где нижние уровни больше ориентированы на значения отдельных пикселей [1]. Поэтому мы используем самый верхний уровень CNN для определения функции потери контента.

ПозволятьA ^ l_ {IJ} (I)быть активацияLй слой,якарта объектов иJПозиция, полученная с использованием изображенияя, Тогда потеря контента определяется как

Потеря контента

по существуL_ {содержание}фиксирует среднеквадратичную ошибку между активациями, созданными сгенерированным изображением и изображением контента. Но почему минимизация разницы между активациями верхних уровней обеспечивает сохранение контента изображения контента?

Интуиция за потерю контента

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

Мы можем определить стоимость контента следующим образом.

Функция потери стиля

Определение функции потери стиля требует больше работы. Чтобы извлечь информацию о стиле из сети VGG, мы используем все слои CNN. Кроме того, информация о стиле измеряется какколичество корреляции между картами объектовв данном слое. Затем потеря определяется как разность корреляции, присутствующей между картами объектов, вычисленными сгенерированным изображением и изображением стиля. Математически потеря стиля определяется как:

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

Интуиция позади потери стиля

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

Ниже вы можете увидеть иллюстрацию того, как вычисляется матрица стилей. Матрица стилей - это, по сути, матрица Грама, где(I, J)Элемент матрицы стилей вычисляется путем вычисления поэлементного умноженияяиJЭта функция карты и суммирование по ширине и высоте. На рисунке красный крест обозначает поэлементное умножение, а красный знак плюс обозначает суммирование по всей ширине карты возможностей.

Вы можете вычислить потерю стиля следующим образом.

Почему этот стиль запечатлен в матрице Грамма?

Здорово, что мы знаем, как вычислить потерю стиля. Но вам все еще не показали, «почему потеря стиля вычисляется с использованием матрицы Грамма». Матрица Грама, по существу, фиксирует «распределение объектов» набора карт объектов в данном слое. Стараясь свести к минимуму потерю стиля между двумя изображениями, вы по существу сопоставляете распределение признаков между двумя изображениями [3, 4].

ЗаметкаЛично я не думаю, что на поставленный выше вопрос был дан удовлетворительный ответ. Например, [4] объясняет сходство между потерей стиля иадаптация домена, Но эти отношения не отвечают на поставленный выше вопрос.

Итак, позвольте мне попытаться объяснить это немного более интуитивно. Скажем, у вас есть следующие карты функций. Для простоты я предполагаю только три карты характеристик, и две из них полностью неактивны У вас есть один набор объектов, где первая карта объектов выглядит как собака, а во втором наборе карт объектов первая карта объектов выглядит как собака с ног на голову. Затем, если вы попытаетесь вручную вычислить потери контента и стиля, вы получите эти значения. Это означает, что мы не потеряли информацию о стиле между двумя наборами карт объектов. Тем не менее, содержание совсем другое.

Понимание потери стиля

Окончательная потеря

Окончательная потеря определяется как,

гдеαа такжеβпользовательские гиперпараметры. ВотβвпиталМ ^ лкоэффициент нормализации, определенный ранее. Контролируяαа такжеβВы можете контролировать количество контента и стиля, введенного в сгенерированное изображение. Вы также можете увидеть приятную визуализацию различных эффектов разныхαа такжеβзначения вбумага,

Определение оптимизатора

Далее вы используете оптимизатор Adam для оптимизации потери сети.

Определение входного конвейера

Здесь вы определяете полный входной конвейер.tf.dataобеспечивает очень простой в использовании и интуитивно понятный интерфейс для реализации входных конвейеров. Для большинства задач по обработке изображений вы можете использоватьtf.imageAPI, однако способностьtf.imageобрабатывать изображения динамического размера очень ограничен. Например, если вы хотите динамически обрезать и изменять размеры изображений, это лучше сделать в форме генератора, как это реализовано ниже.

Вы определили два входных конвейера; один для контента и один для стиля. Конвейер ввода контента ищетjpgизображения, начинающиеся со словаcontent_где конвейер стиля ищет изображения, начинающиеся сstyle_,

Определение вычислительного графа

Теперь вы готовы к рок-н-роллу! В этом разделе вы будете определять полный вычислительный граф.

  • Определите итераторы, которые предоставляют входные данные
  • Определите входные данные и переменные CNN
  • Определите содержание, стиль и общую потерю
  • Определить операцию оптимизации

Передача стиля бега

Пора запустить вычислительный граф и сгенерировать несколько иллюстраций. Созданная работа будет сохранена вdata/gen_0,data/gen_1...,data/gen_5и др. папки.

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

Вывод

В этом уроке вы узнали о передаче нейронного стиля. Нейронный стиль передачи позволяет смешивать два изображения (одно с содержанием и другое со стилем) вместе, чтобы создать новое искусство. Сначала вы узнали, почему вам нужна передача нейронного стиля, и краткий обзор архитектуры метода. Затем вы определили специфику сети передачи нейронных стилей с помощью TensorFlow. В частности, вы определили несколько функций для определения переменных / входных данных, вычисления выходных данных VGG, расчета потерь и выполнения оптимизации. Затем вы поняли две потери, которые позволяют нам достичь того, чего мы хотим; потеря содержимого и потеря стиля в деталях, и увидели, как они собираются вместе, чтобы определить окончательную потерю Наконец, вы запустили модель и увидели изображение, сгенерированное моделью.

Код для этого урока доступенВот,

дальнейшее чтение

[1] Нейронный алгоритм художественного стиля

[2] Учебник Tensorflow по передаче нейронного стиля

[3] Статья Quora о передаче нейронного стиля

[4] Демистифицирующий нейронный стиль

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map