Как да създадете фалшиви изображения на компютър с помощта на GAN

Сега всички сме били на това място в детската градина, когато е време за изкуство. Оглеждаш се и виждаш всички останали деца да рисуват хубави малки снимки, които изглеждат така:

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

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

Ето как биха изглеждали снимките

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

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

И така, как тези компютри измислят вълшебните образи на фалшиви хора? Всичко е благодарение на нещо, наречено GAN's

Какво представляват GAN и как точно работят?

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

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

Състезателно обучение:

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

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

След това се опитва да определи кои са истинските и какво е създадено от генератора.

Това е състезателната част на GAN.

Това е диаграма, показваща потока на GAN

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

Игра Minimax:

Когато една мрежа (дискриминатор) се опитва да увеличи или увеличи шансовете да бъде правилна, докато другата мрежа (генератор) се опитва да заблуди или да сведе до минимум шансовете да бъде правилна, наречена е minimax игра.

Дискриминаторът връща число между 1 и 0, което показва вероятността то да е реално. 1 е истински, а 0 е фалшив. Понякога резултатите са правилни, а друг път не е, но всеки път научаваме повече за тях. Ако картината, която генерира генераторът, получи вероятност от 50% (0,5) или по-висока от дискриминатора, той официално го е заблудил. Когато GAN достигне равновесие, това означава, че фалшивите изображения на хората на генератора са толкова добри, че изглеждат точно като изображенията от набора от данни и дискриминаторът няма друг избор, освен да случайно да отгатне дали изображението е истинско или не (следователно връща 0,5).

Дълбоки конволюционни GANs

Един от най-добрите GAN модели за генериране на тези изображения се нарича Deep Convolutional GAN ​​(DCGAN). DCGAN включва светещи слоеве в GAN, за да му помогне да работи по-ефективно.

Какво представляват слоевете със светене?

И така, какви точно са тези спирални слоеве? Е, те са просто начин да получите конкретни функции от изображение по енергийно ефективен начин. Всеки неврон в слоя сканира различна част от изображението (вместо всеки неврон, разглеждащ всеки пиксел) и той извлича различни характеристики. Колкото повече слоеве сте подредите и използвате, толкова по-сложни ще бъдат функциите, които извличате.

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

Как направих това

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

Дискриминаторът:

клас дискриминатор (nn. Модул):
       def __init __ (самостоятелно, ngpu):
           супер (дискриминатор, себе си) .__ init __ ()
           self.ngpu = ngpu
           self.main = nn.Пореден (
               # входът е (nc) x 64 x 64
               nn.Conv2d (nc, ndf, 4, 2, 1, пристрастия = Грешно),
               nn.LaakyReLU (0,2, inplace = True),
               # размер на състоянието (ndf) x 32 x 32
               nn.Conv2d (ndf, ndf * 2, 4, 2, 1, пристрастия = Грешно),
               nn.BatchNorm2d (ndf * 2),
               nn.LaakyReLU (0,2, inplace = True),
               # размер на състоянието (ndf * 2) x 16 x 16
               nn.Conv2d (ndf * 2, ndf * 4, 4, 2, 1, пристрастие = Грешно),
               nn.BatchNorm2d (ndf * 4),
               nn.LaakyReLU (0,2, inplace = True),
               # размер на състоянието (ndf * 4) x 8 x 8
               nn.Conv2d (ndf * 4, ndf * 8, 4, 2, 1, пристрастие = Грешно),
               nn.BatchNorm2d (ndf * 8),
               nn.LaakyReLU (0,2, inplace = True),
               # размер на състоянието (ndf * 8) x 4 x 4
               nn.Conv2d (ndf * 8, 1, 4, 1, 0, пристрастия = Грешно),
               nn.Sigmoid ()
           )
      def напред (самостоятелно, въвеждане):
          връщане на self.main (въвеждане)

Така че, както можете да видите в кода по-горе, дискриминаторът използва конволюционни слоеве, както и пакет от нормализирани слоеве, за да ускори мрежата. Тогава функциите за активиране на Leaky ReLU се използват за определяне дали изображението е реално или не. След това използва сигмоидна функция, за да постави изхода с вероятност между 0 и 1.

Първоначалното изображение, което е вляво, преминава през куп слоеве от Convolutional, показани от блоковете, преди да достигне до слоя в мястото, където мрежата извежда дали изображението е истинско или фалшиво (1 за реално, 0 за фалшиво).

Генераторът:

клас генератор (nn. Модул):
     def __init __ (самостоятелно, ngpu):
         супер (Генератор, самостоятелно) .__ init __ ()
         self.ngpu = ngpu
         self.main = nn.Пореден (
             # входът е Z, преминаващ в свиване
             nn.ConvTranspose2d (nz, ngf * 8, 4, 1, 0, отклонение = грешно),
             nn.BatchNorm2d (ngf * 8),
             nn.ReLU (True),
             # размер на състоянието (ngf * 8) x 4 x 4
             nn.ConvTranspose2d (ngf * 8, ngf * 4, 4, 2, 1, отклонение = грешно),
             nn.BatchNorm2d (ngf * 4),
             nn.ReLU (True),
             # размер на състоянието (ngf * 4) x 8 x 8
             nn.ConvTranspose2d (ngf * 4, ngf * 2, 4, 2, 1, отклонение = грешно),
             nn.BatchNorm2d (ngf * 2),
             nn.ReLU (True),
             # размер на състоянието (ngf * 2) x 16 x 16
             nn.ConvTranspose2d (ngf * 2, ngf, 4, 2, 1, отклонение = грешно),
             nn.BatchNorm2d (NGF),
             nn.ReLU (True),
             # размер на състоянието (ngf) x 32 x 32
             nn.ConvTranspose2d (ngf, nc, 4, 2, 1, пристрастие = Грешно),
             nn.Tanh ()
             # размер на състоянието (nc) x 64 x 64
          )
    def напред (самостоятелно, въвеждане):
        връщане на self.main (въвеждане)

Както виждате генераторът има подобна структура, но е обратен.

Започва с вектор от 100 случайни стойности между -1 и 1. След това прекарва вектора през куп слоеве, транспонирани по сложен начин (както и някои функции за нормализиране и активиране), за да превърне вектора в изображение.

Конволюционният транспониращ слой прави обратното на светещия слой. Вместо да картографира група от стойности в 1 стойност, тя картографира 1 стойност в група от стойности.

Например, един спираловиден слой би превърнал числата 1, 2, 3, 4, 5, в 3, а конволюционният транспониращ слой ще превърне числото 3 в числата 1, 2, 3, 4, 5.

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

По време на обучението генераторът трябва да измисли най-добрите начини да трансформира векторите в фалшиви лица.

обучение

За процеса на обучение обучих GAN в този процес.

  1. Използвайте дискриминатора, за да класифицирате куп реални снимки
  2. Редактирайте дискриминатора въз основа на резултатите
  3. Използвайте дискриминатора, класифицирайки куп фалшиви снимки
  4. Настройте дискриминатора и генератора въз основа на резултатите
  5. повторение

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

Бъдеще и приложения на GAN's

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

Например, GAN могат да ви помогнат да направите банка.

това е реална картина, която създаде GAN

Тази картина беше продадена за 432 500 долара и дори не е реална. Така че можете да използвате GAN, за да печелите пари.

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

Акценти

храна за вкъщи

GANs са по-ново поле в машинното обучение, но те са много обещаващи и определено трябва да бъдат наясно.

Ето някои поемания и неща, които трябва да имате предвид относно GAN:

  • GAN използва две конкурентни невронни мрежи, за да генерира данни, които много наподобяват данните за обучение.
  • Мрежата на дискриминатора се опитва да определи дали изображението, което е дадено, е истинско или фалшиво.
  • Генераторът се опитва да заблуди дискриминатора да мисли, че изображенията му са реални.

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