публикувано на 12-09-2019

Преподаване на компютри да рисуват като Ван Гог

Кампусът от Станфорд от AI Van Gogh

Една от най-завладяващите области на Deep Learning е, без съмнение, създаването на изкуство.

Чакаме какво?

Спомням си, когато за пръв път видях това, умът ми беше взривен. При внимателна проверка можеше да е човешки шедьовър по моите стандарти (не че знам много за изкуството). Но не беше

Оказва се, този тип неща се обаждат на Neural Style Transfer (NST), публикуван за първи път в статия през 2015 г. и всъщност е математика. И така, реших да опитам да науча за себе си и да изградя NST модел.

Звезден нощен ден в Торонто от лаптопа на Алекс

Всъщност не е толкова трудно, колкото си мислите.

Ето как можете да го направите:

В една нормална конволюционна невронна мрежа (която използваме за откриване на обекти, самостоятелно шофиране и разпознаване на лице и т.н.), ние го обучаваме, за да сведем до минимум грешката, която различни параметри на всеки слой ще причинят, когато се опитваме да открием обект или класифицираме изображение , Ако параметрите направят CNN предположението грешно, се връщаме назад и ги променяме, така че следващия път да са малко по-близо до това.

За NST първо инициализираме изображение с произволно генерирани RGB стойности за всеки пиксел:

След това ние обучаваме CNN да минимизираме грешката, която стойностите на пикселите ще причинят въз основа на произволна цел, която решим. Така че вместо да променяме параметрите след всяка стъпка на обратно разпространение, за да сведем до минимум грешката, актуализираме действителните пиксели на изображението.

И така, теоретично нашата задача е проста:

Трябва да напишем разходна функция, която може да бъде сведена до минимум, където крайният резултат след определено количество тренировъчни повторения е генерираното изображение, което съчетава стила на картина на Ван Гог със съдържанието на входното изображение, както се вижда по-горе.

ОК, но за да направим това, все още трябва да представяме стил и съдържание математически. Нека първо разделим написването на функцията за разходи на три части:

  1. Напишете функция за разходите за съдържанието на изображението
  2. Напишете функция на разходите за стила на изображението
  3. Комбинирайте двете предишни разходи в претеглена, обща функция на разходите.

Нека да започнем.

1. Съдържателна цена

Как математически да представяме съдържание? Тоест, как да се уверим, че ако съдържателното ни изображение съдържа обект, генерираното ни изображение ще съдържа и разпознаваема форма на този обект, където лесно можем да съпоставим характеристиките им и да кажем: „Ей, това е едно и също нещо, просто боядисани по различен начин?

Това е свързано с това как CNN всъщност се учи. Нека използваме мощната VGG-19 Neural Net като пример. Ние също ще го използваме, за да приложим NST в крайна сметка.

VGG-19 спечели на ISLVRC-2014 Challenge

CNN като това работи, като първо открива много малки детайли от матрици на R, G и B стойности, съответстващи на всеки пиксел, като малките ръбове на обектите, и продължава да открива по-големи, по-сложни форми, докато не успее да отгатне какво изображението е изобразено въз основа на неговите минимални компоненти. Ето една страхотна визуализация:

Изображенията по-горе показват различни функции, които увеличават максимално активациите на всеки слой. Това означава, че за всеки слой, всяко поле 3x3 в мрежата показва в известен смисъл какво търси неврон. (Прилагаме така наречената функция на активиране след всеки слой, за да отделим данни, които разпознаваме от данните, които не разпознаваме, оттук и „активиране“).

Тук специално се предлага VGG-19. 19-слойният CNN е проучен на базата данни ImageNet, която съдържа хиляди класове изображения и много тренировъчни изображения във всеки клас. Това прави по-вероятно моделът да запази съдържанието на изображението, тъй като каквото и да е съдържанието, той вероятно се вписва в един от хилядите класове, а ако не, вероятно някой от невроните търси нещо подобно на компонентите на съдържателния обект.

Сега просто трябва да стартираме функцията за разходи върху всички слоеве на CNN, като се уверим, че всички представи на съдържанието присъстват. Можем да направим това, защото вече развихме интуицията, че ако всички активации на определен слой са сходни, изображенията, които преминават през слоя, ще бъдат сходни и при дадената им подробност.

И така, там го имате. Ако имате подобни активи в слой, имате подобно съдържание. Сега за нашата функция на разходите, просто трябва да сме сигурни, че проверяваме за подобно съдържание във всеки слой, докато започнем да променяме стила.

Това е нещо подобно, ако сте любопитни:

Опитваме се да намалим нормализираната сума над разликите на всички скрити активи в съдържанието и генерираните изображения, представящи техните характеристики

2. Цена стил

След като имаме цената на съдържанието, не искаме моделът ни само да продължава да се променя за едно и също съдържание. Ако това беше така, то ще изведе същото изображение, което и ние.

Искаме да го балансираме със стила на по-"артистичния" образ. Но проблемът тук е как да извлечем математически „стила“?

Ако се замислите, стилът наистина е корелацията между определени части от съдържанието по отношение на местоположението им в изображение. Например, ако има вертикални щрихи на същите места като оранжевите петна, това би представлявало характерен стил. Ако повече функции корелират, тогава можете да видите как можем да пресъздадем нещо като стил на Ван Гог.

Така че, за нашия стил на изображение, ние основно съпоставяме всяка функция с всяка друга функция във всеки един слой, като ги умножаваме всички заедно, за да създадем матрица на стил (или матрица Gram, както е известна иначе) за изображението. Нещо като това:

Използвайки това, което знаем за активирането от цената на съдържанието, цената на стила ще намали разликата между матрицата на стила в изображението на стил и матрицата на стила в генерираното изображение и ще се опита да ги направи по-близки.

Това е функцията на разходите за матрицата на един слой:

Но това не е всичко. Причината, поради която продължавам да наблягам на един слой, е следната. Да предположим, че сме изчислили функцията на разходите за стил на слой 1 от CNN. Характеристиките, които този слой открива, биха били изключително малки; вероятно дори не е достатъчно голям, за да бъде наречен от хората „стил“. Това не би имало желания резултат, на който се надявахме. Какво става, ако художник има по-големи художествени стилове, свързани със симетрията или геометрията на определени форми в цялото изображение. Не бихме могли да отразим това нито в генерираното ни изображение.

Ето защо трябва да изчислим матрица за стил и цена за стил за няколко специфични слоя в CNN. Като този:

Обобщаване на всички избрани слоеви разходи, умножени с теглото на лямбда

Тази формула ни позволява много по-цялостно да отразяваме стила на художника.

Това е стилът.

3. Обща цена

Останалото е доста просто. Просто трябва да поемем тези две функции; стила и съдържанието и ги поставете в една голяма функция, която постига разумен баланс между тях:

Сума на теглото Алфа спрямо цената на съдържанието и теглото Бета спрямо цената на стила. Алфа и бета се настройват като хиперпараметри

Опаковане всичко

Така че, използвайки тези алгоритми, NST се изпълнява в следните стъпки:

  1. Стартирайте съдържателното изображение през VGG-19 и събирайте активациите в определен слой
  2. Стартирайте стиловото изображение чрез VGG-19, събирайте активации и изчислете матрици за стил на множество слоеве.
  3. Генериране на шум изображение
  4. Извършете изчислението на графиката, която изпълнява шумовото изображение през VGG-19, събира активирания, изчислява спрямо общата цена и графиката извършва обратното размножаване, променяйки входния шум изображение, което става вход за следващата итерация. Повтаря се за желания брой повторения

Можете да видите моето изпълнение на Github тук.

Като направи крачка назад

Сега, гледайки какво сме направили и какво са ни показали авторите на документа NST, трябва наистина да върнем това в перспектива.

Машина е направила изкуство.

Дори ако NST няма приложения, които променят света, това ни показва, че границите на това, което смятаме, че AI може да прави, се разширява всеки ден. И това прави всичко различно.

Това е първата от поредица теми за машинно обучение, за която ще пиша.

Ако имате някакви въпроси, не се колебайте да се свържете с мен на Linkedin или да ми изпратите имейл на zhual@utschools.ca.

Благодаря за четенето!

Вижте също

Определяне на културните изкуства: Да направим градовете велики#Sketchbook_SaturdayЦвят и енергия: какво предпочитанията ни разкриват пред тренираното трето окоFRESCO приветства нов съветник Хо Джа КимКак можете да намалите тежестите в живота си?Как да насърчавате вашето изкуство ефективно, когато едва започвате